turtle-cli构建Android APK报错'expo-module-prepare'不存在
Android平台开发版APK构建报错排查
问题现象
执行turtle命令构建Android APK时持续报错,同环境下iOS平台IPA包可正常编译,项目在其他设备上可正常编译运行。
完整错误日志
14572 timing reify:rollback:createSparse Completed in 5948ms 14573 timing reify:rollback:retireShallow Completed in 14ms 14574 timing command:install Completed in 278406ms 14575 verbose stack Error: command failed 14575 verbose stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/@npmcli/promise-spawn/lib/index.js:63:27) 14575 verbose stack at ChildProcess.emit (node:events:527:28) 14575 verbose stack at maybeClose (node:internal/child_process:1092:16) 14575 verbose stack at Process.ChildProcess._handle.onexit (node:internal/child_process:302:5) 14576 verbose pkgid @expo/html-elements@0.0.2 14577 verbose cwd /Users/faisaliqbal/.turtle/workingdir/android/sdk42 14578 verbose Darwin 21.3.0 14579 verbose node v16.15.1 14580 verbose npm v8.11.0 14581 error code 1 14582 error path /Users/faisaliqbal/.turtle/workingdir/android/sdk42/packages/html-elements 14583 error command failed 14584 error command sh -c expo-module prepare 14585 error /Users/faisaliqbal/.turtle/workingdir/android/sdk42/node_modules/commander/index.js:837 14585 error throw new Error(executableMissing); 14585 error ^ 14585 error 14585 error Error: 'expo-module-prepare' does not exist 14585 error - if 'prepare' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead 14585 error - if the default executable name is not suitable, use the executableFile option to supply a custom name 14585 error at ChildProcess.<anonymous> (/Users/faisaliqbal/.turtle/workingdir/android/sdk42/node_modules/commander/index.js:837:15) 14585 error at ChildProcess.emit (node:events:527:28) 14585 error at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12) 14585 error at onErrorNT (node:internal/child_process:478:16) 14585 error at processTicksAndRejections (node:internal/process/task_queues:83:21) 14586 verbose exit 1 14587 timing npm Completed in 278532ms 14588 verbose unfinished npm timer reify 1656882423113
当前环境与依赖版本
OS - darwin 12.2.1 (Monterey) turtle - 0.27.4 Java (2) Versions: java 18.0.1.1 2022-04-22 openjdk 11.0.15 2022-04-19 expo - 5.4.12 nodejs - v16.15.1 npm - 8.11.0 setup:android is all good setup:ios is all good IPA (IOS Binary) compiles without any issue.
构建执行命令
turtle build:android \ --keystore-path ./keystore/keystore_android.jks \ --keystore-alias "store (redacted)" \ --allow-non-https-public-url \ --gradle-args "--warning-mode all" \ --public-url expo_url (redacted) \ -t apk
报错根因
核心报错是执行@expo/html-elements包的prepare脚本时,找不到expo-module-prepare可执行文件,由三个问题共同导致:
- npm版本兼容性问题:使用的npm 8.11.0和Expo SDK42的构建链不兼容,SDK42发布时默认配套npm 6.x版本,npm 8.x修改了monorepo子包脚本执行时的PATH注入逻辑,无法正确识别当前工作目录下node_modules里的可执行命令
- turtle本地缓存损坏:之前构建失败残留的
~/.turtle/workingdir/android/sdk42目录文件不完整,依赖没有正确安装,bin软链缺失 - Java版本冲突:本地同时安装了Java 18和OpenJDK 11,turtle构建Android时默认可能调用Java 18,后续即使绕过当前npm报错也会触发Gradle兼容性问题
修复步骤
按顺序执行以下操作即可解决问题:
- 清理损坏的turtle构建缓存,执行命令:
rm -rf ~/.turtle/workingdir/android/sdk42 - 将npm版本降级到SDK42兼容的6.x版本,执行命令:
npm install -g npm@6 - 当前终端会话强制指定使用OpenJDK 11作为默认Java版本,执行命令:
export JAVA_HOME=$(/usr/libexec/java_home -v 11) - 重新执行原来的APK构建命令即可。
如果清理缓存后仍然提示找不到expo-module-prepare,可手动给对应执行文件加权限:
chmod +x ~/.turtle/workingdir/android/sdk42/node_modules/@expo/cli/build/bin/*.js后再重试。
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

