'AWS Amplify clients always fail to build with Expo
Following the AWS Amplify documentation for Expo with the steps below, building with EAS build fails with
[RUN_FASTLANE] › Executing baseline » Bundle React Native code and images
[RUN_FASTLANE] the transform cache was reset.
[RUN_FASTLANE] › Generating debug baseline » baseline.app.dSYM
[RUN_FASTLANE] ▸ ** ARCHIVE FAILED **
[RUN_FASTLANE] ▸ The following build commands failed:
[RUN_FASTLANE] ▸ PhaseScriptExecution Bundle\ React\ Native\ code\ and\ images /Users/Rax/Library/Developer/Xcode/DerivedData/baseline-hhrsifdg
[RUN_FASTLANE] ▸ (1 failure)
[RUN_FASTLANE] ** ARCHIVE FAILED **
[RUN_FASTLANE]
[RUN_FASTLANE]
[RUN_FASTLANE] The following build commands failed:
[RUN_FASTLANE] PhaseScriptExecution Bundle\ React\ Native\ code\ and\ images /Users/Rax/Library/Developer/Xcode/DerivedData/baseline-xxxxxxx
[RUN_FASTLANE] (1 failure)
[RUN_FASTLANE] Exit status: 65
[RUN_FASTLANE]
[RUN_FASTLANE] +-------------+-------------------------+
[RUN_FASTLANE] | Build environment |
[RUN_FASTLANE] +-------------+-------------------------+
[RUN_FASTLANE] | xcode_path | /Applications/Xcode.app |
[RUN_FASTLANE] | gym_version | 2.205.2 |
[RUN_FASTLANE] | sdk | iPhoneOS15.2.sdk |
[RUN_FASTLANE] +-------------+-------------------------+
[RUN_FASTLANE] Looks like fastlane ran into a build/archive error with your project
[RUN_FASTLANE] It's hard to tell what's causing the error, so we wrote some guides on how
[RUN_FASTLANE] to troubleshoot build and signing issues: https://docs.fastlane.tools/codesigning/getting-started/
[RUN_FASTLANE] Before submitting an issue on GitHub, please follow the guide above and make
[RUN_FASTLANE] sure your project is set up correctly.
[RUN_FASTLANE] fastlane uses `xcodebuild` commands to generate your binary, you can see the
[RUN_FASTLANE] the full commands printed out in yellow in the above log.
[RUN_FASTLANE] Make sure to inspect the output above, as usually you'll find more error information there
[RUN_FASTLANE]
[RUN_FASTLANE] [!] Error building the application - see the log above
[RUN_FASTLANE] Error: Fastlane build failed with unknown error. Please refer to the "Run fastlane" and "Xcode Logs" phases.
Fastlane errors in most cases are not printed at the end of the output, so you may not find any useful information in the last lines of output when lo
[CLEAN_UP_CREDENTIALS] Destroying keychain - XXXXXXXXXX.keychain
[CLEAN_UP_CREDENTIALS] Removing provisioning profile
Build failed
Fastlane build failed with unknown error. Please refer to the "Run fastlane" and "Xcode Logs" phases.
Fastlane errors in most cases are not printed at the end of the output, so you may not find any useful information in the last lines of output when lo
Error: npx exited with non-zero code: 1
Steps followed:
- Create a new project with
expo init
closing TypeScript with basic navigation. - Install AWS Amplify dependencies with
expo install aws-amplify aws-amplify-react-native @react-native-community/netinfo @react-native-async-storage/async-storage @react-native-picker/picker
- Pull my AWS Amplify project with
amplify pull
making the following selections:? Select the authentication method you want to use: AWS profile ? Please choose the profile you want to use amplify-cli ? Which app are you working on? XXXXXXXX Backend environment 'dev' found. Initializing... ? Choose your default editor: IntelliJ IDEA ? Choose the type of app that you're building javascript Please tell us about your project ? What javascript framework are you using react-native ? Source Directory Path: / ? Distribution Directory Path: / ? Build Command: eas build --profile development --platform ios --local ? Start Command: expo start --dev-client
- Add specified AWS Amplify boilerplate to
App.tsx
:import { Amplify } from 'aws-amplify' import awsconfig from 'aws-exports' Amplify.configure(awsconfig)
- Build with
eas build --profile development --platform ios --local
{
"name": "amptest",
"version": "1.0.0",
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"eject": "expo eject",
"test": "jest --watchAll"
},
"jest": {
"preset": "jest-expo"
},
"dependencies": {
"@expo/vector-icons": "^13.0.0",
"@react-native-async-storage/async-storage": "^1.17.4",
"@react-native-community/netinfo": "8.2.0",
"@react-native-picker/picker": "2.4.0",
"@react-navigation/bottom-tabs": "^6.0.5",
"@react-navigation/native": "^6.0.2",
"@react-navigation/native-stack": "^6.1.0",
"aws-amplify": "^4.3.22",
"aws-amplify-react-native": "^6.0.4",
"expo": "~45.0.0",
"expo-asset": "~8.5.0",
"expo-constants": "~13.1.1",
"expo-dev-client": "~0.9.5",
"expo-font": "~10.1.0",
"expo-linking": "~3.1.0",
"expo-splash-screen": "~0.15.1",
"expo-status-bar": "~1.3.0",
"expo-system-ui": "~1.2.0",
"expo-web-browser": "~10.2.0",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-native": "0.68.2",
"react-native-safe-area-context": "4.2.4",
"react-native-screens": "~3.11.1",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@types/react": "~17.0.21",
"@types/react-native": "~0.66.13",
"jest": "^26.6.3",
"jest-expo": "~45.0.0",
"react-test-renderer": "17.0.2",
"typescript": "~4.3.5"
},
"private": true
}
Solution 1:[1]
I've found the cause of the issue, which can only be fully resolved by a change the way AWS Amplify works.
Issue
AWS Amplify adds aws-exports.js
to .gitignore
in a section bounded by #amplify-do-not-edit-begin/end
. This makes some sense since the file contains API keys. But reasonable or not, it creates a problem. Out of the box, AWS Amplify can't work with eas build
or other tools that use Git to identify project files.
Short Term Fix
Manually disabling the ignore (e.g. with !aws-exports.js
) makes aws-exports.js
available to eas build
. (Using .easignore
is also a possibility but that has downsides and is probably overkill.)
Long Term Solution
Clearly the above is not a long term solution for any real world project since despite what the documentation says) aws-exports.js
contains sensitive information and should indeed be ignored by Git. Instead AWS Amplify needs to be able to work with the following approach:
- do not git-ignore
aws-exports.js
- replace sensitive information values in
aws-exports.js
with environment variables, that are (i) managed automatically by AWS on the backend (e.g., for hosting builds) and (ii) set in the usual way in other environments (e.g., CI, local builds, etc.) by users.
As is, it feels like Amplify was architected for web hosted apps (e.g. aws-exports.js
gets regenerated for them) but that the scenarios for mobile apps were not thought through.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |