EAS 构建失败:无法解析模块 ./aws-exports
EAS build fails : Unable to resolve module ./aws-exports
当我 运行 移动应用使用
时,我正在 expo 43
和 Amplify
一起使用
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
当我 运行 移动应用使用
时,我正在expo 43
和 Amplify
一起使用
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