You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可执行文件,由三个问题共同导致:

  1. npm版本兼容性问题:使用的npm 8.11.0和Expo SDK42的构建链不兼容,SDK42发布时默认配套npm 6.x版本,npm 8.x修改了monorepo子包脚本执行时的PATH注入逻辑,无法正确识别当前工作目录下node_modules里的可执行命令
  2. turtle本地缓存损坏:之前构建失败残留的~/.turtle/workingdir/android/sdk42目录文件不完整,依赖没有正确安装,bin软链缺失
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:15:35