EAS 构建失败:无法解析模块 ./aws-exports

EAS build fails : Unable to resolve module ./aws-exports

当我 运行 移动应用使用

时,我正在 expo 43Amplify 一起使用
expo run:android

我可以在移动设备上看到我的应用程序 运行ning。

但是当我尝试创建相同的版本时

eas build -p android

我低于错误

Gradle build failed with unknown error. Please see logs for the "Run gradlew" phase

这里很简单json

{
  "cli": {
    "version": ">= 0.46.0"
  },
  "build": {
    "development": {
      "distribution": "internal",
      "android": {
        "gradleCommand": ":app:assembleDebug"
      },
      "ios": {
        "buildConfiguration": "Debug"
      }
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {}
  },
  "submit": {
    "production": {}
  }
}

这是 eas build 的日志

[stderr]   40 | import { enableScreens } from "react-native-screens";
Error: Unable to resolve module ./aws-exports from /root/workingdir/build/App.js: 
None of these files exist:
  * aws-exports(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)
  * aws-exports/index(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)
  40 | import { enableScreens } from "react-native-screens";
  41 | import Amplify from 'aws-amplify'
> 42 | import config from './aws-exports'

我在根目录中有 aws-exports.js,它适用于 expo run:android

日志中显示了根本问题:EAS 构建无法解析模块 ./aws-exports

有两个原因:

  • a) 此文件在您的存储库中被忽略,因为它包含敏感数据(这是 .gitignore 中 amplify 的默认配置)
  • b) EAS 在他们的服务器上上传了存储库的副本,所以因为 a) aws-exports.js 没有被复制。因此构建错误。

我使用 EAS Secret 功能解决了这个问题。诀窍是将 aws-exports.js 的内容用 base64 编码到一个变量中,表示 AWS_EXPORTS。这个变量可以在名为 eas-build-pre-install 的 pre-install 挂钩中使用,因此我们可以告诉 EAS 解码该值并将其写回 aws-exports.js,因此该文件将在构建时可用。

这是通过在 package.json 中添加这两个脚本来完成的:

 "aws-export": "echo 'Update Expo AWS_EXPORTS secret with value: \n\n' && cat aws-exports.js |base64"

运行 aws-export 脚本,然后通过 Expo 网站上的 Secrets 选项卡或使用 eas secret:create 命令设置编码内容。每次更改 amplify 时不要忘记更新值以反映 aws-exports.js !

中的本地更改

然后 pre-install 挂钩将解码该值(这是 EAS 自动 运行):

"eas-build-pre-install": "echo $AWS_EXPORTS | base64 -d > ./aws-exports.js"

运行 再次构建。

colinux 所述,EAS 在其服务器上上传了存储库的副本,因为 aws-exports 是.gitignore,它没有上传到服务器,因此我们有构建错误。请阅读 colinux 的 答案以获得更多详细信息。

这里的解决方案是在你的包中添加这两行 JSON。

1. "aws-export": "echo 'Update Expo AWS_EXPORTS secret with value: \n\n' && cat aws-exports.js |base64"
2. "eas-build-pre-install": "echo $AWS_EXPORTS | base64 -di > ./aws-exports.js"

注意: 这里在步骤 2 中有一个小的变化。我们必须使用 base64 -di 而不是 base64 -d。 这是因为旧的 cli 无法解码换行符和其他字符。您可以在此处查看更多详细信息: decode base64: invalid input 这部分解决了我发布的构建问题。我收到了与 app:mergeReleaseResources FAILED

有关的更多构建错误

这个 link 应该可以帮助您解决重复资源错误:

解决这些错误后,您应该可以从 EAS 成功构建。

如果您想要 .apk 文件而不是 .aap。请创建一个开发配置文件,如下所述: Configuring a profile to build apks