feat(cmd): ./cmd expo dev 支持透传参数给 expo start(如 -c 清除 Metro 缓存)

This commit is contained in:
kuaifan 2026-10-28 02:43:59 +00:00
parent 7043c4efa6
commit edb2e539a5
2 changed files with 10 additions and 8 deletions

11
cmd
View File

@ -419,11 +419,11 @@ electron_operate() {
# Expo App:同 electron 使用本机 Node,不依赖 Docker。
expo_operate() {
local usage="用法: ./cmd expo [build] | ./cmd expo dev | ./cmd expo npm <参数...>"
local usage="用法: ./cmd expo [build] | ./cmd expo dev [expo start 参数...] | ./cmd expo npm <参数...>"
check_node
case "${1:-build}" in
"build"|"dev")
if [[ $# -gt 1 ]]; then
if [[ "$1" != "dev" ]] && [[ $# -gt 1 ]]; then
error "$usage"
return 1
fi
@ -438,7 +438,8 @@ expo_operate() {
(cd resources/app && npm install --no-audit --no-fund) || return $?
fi
switch_debug dev
node ./electron/build.js app-expo dev
shift
node ./electron/build.js app-expo dev "$@"
else
node ./electron/build.js app-expo build
fi
@ -709,7 +710,7 @@ DooTask 管理脚本
build, prod 生产环境构建
electron 构建桌面应用
expo [build] 编译并同步 Expo App 前端
expo dev 启动 App 开发模式(Metro + 前端)
expo dev [参数...] 启动 App 开发模式(Metro + 前端),参数透传给 expo start(如 -c)
expo npm <参数...> 在 Expo 子模块执行本机 npm
🔧 服务管理:
@ -763,7 +764,7 @@ Usage: ./cmd <command> [options]
build, prod Production build
electron Build desktop app
expo [build] Build and copy Expo App web assets
expo dev Start App dev mode (Metro + web)
expo dev [args...] Start App dev mode (Metro + web), args passed to expo start (e.g. -c)
expo npm <args...> Run local npm in the Expo submodule
🔧 Services:

7
electron/build.js vendored
View File

@ -509,8 +509,8 @@ if (["dev"].includes(argv[2])) {
child_process.spawn("npx", ["vite", "--", "fromcmd", "electronDev"], {stdio: "inherit"});
child_process.spawn("npm", ["run", "start-quiet"], {stdio: "inherit", cwd: "electron"});
} else if (argv[2] === 'app-expo') {
if ((argv[3] && !['build', 'dev'].includes(argv[3])) || argv.length > 4) {
console.error("用法: node ./electron/build.js app-expo [build|dev]");
if ((argv[3] && !['build', 'dev'].includes(argv[3])) || (argv[3] !== 'dev' && argv.length > 4)) {
console.error("用法: node ./electron/build.js app-expo [build|dev [expo start 参数...]]");
process.exit(1);
}
const appDir = path.resolve(__dirname, "../resources/app");
@ -522,6 +522,7 @@ if (["dev"].includes(argv[2])) {
// 开发模式:前端 vite + Metro;键盘交给 Metro(r 重载等),任一退出则全部结束
// 地址优先取命令行环境变量,其次按 VSCODE_PROXY_URI 端口模板推导,都没有则 Metro 由 Expo 自动取局域网地址、前端取本机局域网 IP
// 手动指定 EXPO_PACKAGER_PROXY_URL 时端口固定(METRO_PORT,默认 2220),否则从 2220 起自动找空闲端口
// dev 之后的参数原样透传给 expo start(如 -c 清缓存)
const appPort = env.parsed.APP_PORT;
const proxyUri = process.env.VSCODE_PROXY_URI || '';
const proxyUrl = port => proxyUri.includes('{{port}}') ? proxyUri.replace(/\{\{port\}\}/g, port).replace(/\/+$/, '') : '';
@ -550,7 +551,7 @@ if (["dev"].includes(argv[2])) {
if (packagerUrl) appEnv.EXPO_PACKAGER_PROXY_URL = packagerUrl;
const children = [
child_process.spawn("npx", ["vite", "--", "fromcmd"], {stdio: ["ignore", "inherit", "inherit"]}),
child_process.spawn("npx", ["expo", "start", "--dev-client", "--port", String(metroPort)], {stdio: "inherit", cwd: appDir, env: appEnv}),
child_process.spawn("npx", ["expo", "start", "--dev-client", "--port", String(metroPort), ...argv.slice(4)], {stdio: "inherit", cwd: appDir, env: appEnv}),
];
let exiting = false;
const stopAll = (code) => {