【问题标题】:EAS build fails : Unable to resolve module ./aws-exportsEAS 构建失败:无法解析模块 ./aws-exports
【发布时间】:2022-01-29 14:03:47
【问题描述】:

当我在移动设备上运行应用程序时,我正在使用 expo 43Amplify

expo run:android

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

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

eas build -p android

我遇到了错误

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

这里是 eas 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

【问题讨论】:

    标签: android react-native gradle expo


    【解决方案1】:

    日志中显示了根本问题:EAS build can't resolve module ./aws-exports.

    有两个原因:

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

    我通过使用EAS Secret 功能解决了这个问题。诀窍是将aws-exports.js 的内容用base64 编码到一个变量中,即AWS_EXPORTS。此变量可用于名为eas-build-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 中的本地更改!

    然后预安装挂钩将解码该值(这是由 EAS 自动运行的):

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

    再次运行构建。

    【讨论】:

    • 非常感谢@colinux,上面的解决方案对我有用。之后我又遇到了一些问题,稍后将在单独的答案中分享步骤。
    【解决方案2】:

    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相关的构建错误

    如果出现重复资源错误,此链接应该可以帮助您:Duplicate resources error

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-21
      • 2023-03-18
      • 2018-11-13
      • 2021-04-27
      • 2020-05-26
      • 2021-11-08
      • 2022-06-28
      • 2022-06-23
      • 1970-01-01
      相关资源
      最近更新 更多