混合开发过程中,RN需要启动一个metro服务来加载jsbundle文件,每次手动启动比较麻烦,现在配置如下脚本就可以自动启动服务,不用每次手动启动了,生产效率又提高了。

1.配置脚本文件,例如setup_rn.sh

#!/bin/bash 
# --- 配置 ---
NODE_VERSION="18.20.8"
METRO_PORT=8081
WINDOW_TITLE="Metro Server"

# --- 加载 nvm ---
export NVM_DIR="$HOME/.nvm"
# 支持 bash/zsh 用户
#[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
if [ -s "$NVM_DIR/nvm.sh" ]; then
source"$NVM_DIR/nvm.sh"
else
echo"❌ 找不到 nvm,请先安装:https://github.com/nvm-sh/nvm"
exit 1
fi

# --- 使用指定 Node.js 版本 ---
echo" 使用 Node.js 版本 $NODE_VERSION"
nvm install $NODE_VERSION > /dev/null
nvm use $NODE_VERSION

# 安装依赖
echo"==============================="
echo" 开始安装 React Native 依赖..."
echo"==============================="

echo" 当前目录:$(pwd)"

yarn install

# 检查安装是否成功
if [ $? -eq 0 ]; then
echo"✅ 依赖安装完成。"
else
echo"❌ 依赖安装失败。"
exit 1
fi

# --- 释放 8081 端口(如果被占用) ---
#PID=$(lsof -i tcp:8081 | grep LISTEN | awk '{print $2}')
#if [ -n "$PID" ]; then
#  echo " 检测到 8081 端口已被占用(PID: $PID),正在终止相关进程..."
#  kill -9 "$PID"
#  echo "✅ 8081 端口已释放"
#else
#  echo "✅ 8081 端口空闲"
#fi

# 启动 React Native 服务
# shellcheck disable=SC2016
#osascript -e 'tell application "Terminal" to do script "cd '$(pwd)' && yarn start"'

# --- 检查 Metro 是否已运行 ---
echo" 检查 Metro 服务是否运行中..."
METRO_PID=$(lsof -i tcp:$METRO_PORT | grep LISTEN | awk '{print $2}')
if [ -n "$METRO_PID" ]; then
echo"✅ Metro 已在运行(PID: $METRO_PID ),跳过启动"
else
echo" 启动 Metro(启动 Metro(新终端窗口,标题为 '$WINDOW_TITLE')..."

  osascript < tell application  "Terminal"      if  not (exists window 1)  then          do  script  "cd '$(pwd)' && yarn start"      else          do  script  "cd '$(pwd)' && yarn start" in  front window     end  if     activate end tell EOF echo "✅ Metro 启动命令已发出" fi echo " 脚本执行完毕" echo " 所有操作执行完毕。"
2.在项目gradle中配置执行,注意项目路径

tasks.register('runRnSetupScript', Exec) {
    description = "执行React Native相关依赖安装和本地服务启动脚本"
    commandLine 'chmod', '+x','setup_rn.sh' // 先赋予脚本执行权限
    commandLine 'sh', './setup_rn.sh'
    workingDir "${project.rootDir}" // 假设脚本在项目根目录,可根据实际情况调整
}

preBuild.dependsOn runRnSetupScript