web-dev-qa-db-ja.com

ExpoビルドはCIで失敗しますが、ローカルでビルドします(無効な構成が含まれているため、babel-preset-expoは無視されました)

それの古典的なケースは私のマシンで動作します。 2つの反応ネイティブアプリを作成しています。アプリAとアプリB。両方のアプリケーションが expo を使用してブートストラップされました。

ローカルでexpo build:iosのいずれかのアプリをビルドするコマンドを実行すると、両方ともビルドされます。しかし、gitlab-ciでアプリケーションをビルドしようとすると、アプリケーションBのみがビルドに失敗し、次のメッセージが表示されます。

[23:07:28] warn Package babel-preset-expo has been ignored because it contains invalid configuration. Reason: Cannot find module 'babel-preset-expo/package.json'
[23:07:28] Require stack:
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/node_modules/@react-native-community/cli/build/tools/config/resolveNodeModuleDir.js
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/node_modules/@react-native-community/cli/build/tools/releaseChecker/index.js
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/node_modules/@react-native-community/cli/build/commands/server/runServer.js
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/node_modules/@react-native-community/cli/build/commands/server/server.js
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/node_modules/@react-native-community/cli/build/commands/index.js
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/node_modules/@react-native-community/cli/build/index.js
[23:07:28] - /builds/XXX/application-b/node_modules/react-native/local-cli/cli.js
[23:07:28] 
[23:07:29] Starting Metro Bundler on port 19001.
[23:07:29] debug Watch mode is not supported in this environment
[23:07:29] debug Checking for a newer version of React Native
[23:07:29] debug Current version: 0.61.4
[23:07:29] debug No release cache found
[23:07:29] debug No release cache found
[23:07:29] debug Checking for newer releases on GitHub
[23:07:29] debug No release cache found
[23:07:30] Publishing to channel 'default'...
[23:07:30] debug Saving "6d6386b01438c6ef0acd213d304b5839" to cache
[23:07:30] debug No release cache found
[23:07:30] debug No release cache found
[23:07:30] debug Latest release: 0.60.0
[23:07:32] Building iOS bundle
[23:07:43] node_modules/expo/AppEntry.js: Cannot find module 'babel-preset-expo' from '/builds/XXX/application-b'
[23:07:43] › Closing Expo server
[23:07:43] node_modules/expo/AppEntry.js: Cannot find module 'babel-preset-expo' from '/builds/XXX/application-b'
[23:07:43] Failed building JavaScript bundle.
[23:07:43] ::ffff:127.0.0.1 - - [06/Apr/2020:23:07:43 +0000] "GET /node_modules/expo/AppEntry.bundle?dev=false&minify=true&hot=false&platform=ios HTTP/1.1" 500 - "-" "axios/0.19.0"
[23:07:43] › Stopping Metro bundler
[23:07:43] Packager URL http://127.0.0.1:19001/node_modules/expo/AppEntry.bundle?dev=false&minify=true&hot=false&platform=ios returned unexpected code 500. Please open your project in the Expo app and see if there are any errors. Also scroll up and make sure there were no errors or warnings when opening your project.

CIにモジュールbabel-preset-expoを明示的にインストールしてみましたが、それでも問題は解決しません。私のbabel.config.jsは両方のアプリで同一であり、次のようになります。

module.exports = function(api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
  };
};

私の両方のpackage.jsonに次の行があります:

  "devDependencies": {
    "@babel/core": "^7.0.0",
    "babel-preset-expo": "^8.0.0"
  },

エラーAppEntry.jsで参照されている両方のアプリケーションのファイルも同じです。

これが私のgitlab-ci.ymlです:

image: node/Alpine
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - ~/.npm

stages:
  - deploy
  - tag
before_script:
  - echo $CI_BUILD_REF
  - echo $CI_PROJECT_DIR
  - apk add --no-cache bash build-base gcc git python3 curl
  - PATCH=`git log --pretty=oneline | wc -l | sed -e 's/^[[:space:]]*//'`
  - VERSION=`cat VERSION`
  - VERSION=${VERSION%?}
  - TAG="${VERSION}${PATCH}"
  - echo "Build version = ${TAG}"

expo-build:
  stage: deploy
  artifacts:
    paths:
    - ipas/
  script:
    - sed -i "s/0.0.0/${TAG}/g" app.json
    - npm ci --production --cache .npm --prefer-offline
    - npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD
    - EXPO_DEBUG=true npx expo build:ios --non-interactive # This works because it has been already built once through the cli, credentials cannot be pass into env
    - mkdir -p ipas
    - curl "$(npx expo url:ipa --non-interactive)" -o ipas/bravo-teller-$TAG.ipa
  only:
    - master

これが何であるかについてのフィードバックや提案は大歓迎です。ありがとう

3
danielsmith1789

実際には、 babel-preset-expodevDependenciesではありません。dependenciesに追加する必要があります。さらに、babel設定:

[
  'babel-preset-expo',
  {
    lazyImports: true,
  },
]
1
AmerllicA