LoginSignup
2
1

More than 3 years have passed since last update.

yarn workspace を使った monorepo 環境で React Native(Expo) を動かすためにやったこと

Last updated at Posted at 2020-02-16

普通に yarn run expo start を実行するだけでは動かなかったので、
出たエラーとそれを解決するまでにしたことをメモとして残しておきます。

エラーが起きるまでの経緯

  1. expo init packages/app を実行
  2. 生成された packages/app/package.jsonnameversion を追加(expo init 中に yarn install でコケていたのでその対応)
  3. yarn workspace app install を実行
  4. yarn run expo start を実行し、iOS の Expo アプリを起動
  5. dev tool 上に、以下のエラーが表示される
Error: Cannot resolve entry file: The `expo.entryPoint` field defined in your `app.json` points to a non-existent path.
    at getEntryPointWithExtensions (~/workspace/monorepo-sample/node_modules/@expo/config/src/paths/paths.ts:74:15)
    at getEntryPoint (~/workspace/monorepo-sample/node_modules/@expo/config/src/paths/paths.ts:53:10)
    at Object.determineEntryPoint (/@expo/xdl@57.5.2/src/Exp.ts:41:17)
    at manifestHandler (/@expo/xdl@57.5.2/src/Project.ts:2053:28)

環境

  • Node.js v12.14.1
  • yarn v1.21.1
  • ディレクトリ構成
/
+- node_modules/
   +- api/
   +- expo/
   +- react-native/
+- packages/
   +- api/ # for Express
   +- app/
      +- node_modules/
      +- app.json
      +- App.tsx
      +- package.json
   +- web/ # for React SPA 
+- package.json
+- yarn.lock

原因

packages/app/node_modules/expo/ が存在していなかった
-> yarn workspace の仕組みにより、root 側の node_modules 以下に expo ディレクトリが移動していたため

解決方法

expo-yarn-workspaces パッケージを利用すれば解決しました
https://github.com/expo/expo/tree/master/packages/expo-yarn-workspaces

  • 書いてあるとおりやったこと
    1. yarn workspace app add -D expo-yarn-workspaces を実行
    2. packages/app/package.json を修正
      • scripts.postinstall の追加と、main の設定
    3. packages/app/metro.config.js の作成
    4. packages/app/app.jsonpackagerOpts.config を追加
    5. yarn run postinstall を実行)
  • 書いてなかったけどやったこと
    • packages/app/app.json から expo.entryPoint を削除
      • expo start の実行時には、package.jsonmain よりもこちらの設定が優先される模様。
        package.jsonmain と同じ値に変更しても動いたが、消しても package.json の設定値にフォールバックしたので、
        二重メンテを避けるという意味でも削除した。

参考

その他

試したけど解決しなかった方法

cd packages/app/node_modules
ln -s ../../../node_modules/expo expo
cd ..
yarn run expo start

出たエラー

Error: Unable to resolve module `./node_modules/expo/AppEntry` from ``: 

None of these files exist:
  * node_modules/expo/AppEntry(.native|.ios.expo.ts|.native.expo.ts|.expo.ts|.ios.expo.tsx|.native.expo.tsx|.expo.tsx|.ios.expo.js|.native.expo.js|.expo.js|.ios.expo.jsx|.native.expo.jsx|.expo.jsx|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.js|.native.js|.js|.ios.jsx|.native.jsx|.jsx|.ios.json|.native.json|.json|.ios.wasm|.native.wasm|.wasm)
  * node_modules/expo/AppEntry/index(.native|.ios.expo.ts|.native.expo.ts|.expo.ts|.ios.expo.tsx|.native.expo.tsx|.expo.tsx|.ios.expo.js|.native.expo.js|.expo.js|.ios.expo.jsx|.native.expo.jsx|.expo.jsx|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.js|.native.js|.js|.ios.jsx|.native.jsx|.jsx|.ios.json|.native.json|.json|.ios.wasm|.native.wasm|.wasm)
    at ModuleResolver.resolveDependency (~/workspace/monorepo-sample/node_modules/metro/src/node-haste/DependencyGraph/ModuleResolution.js:163:15)
    at ResolutionRequest.resolveDependency (~/workspace/monorepo-sample/node_modules/metro/src/node-haste/DependencyGraph/ResolutionRequest.js:52:18)
    at DependencyGraph.resolveDependency ~/workspace/monorepo-sample/node_modules/metro/src/node-haste/DependencyGraph.js:282:16)
    at ~/workspace/monorepo-sample/node_modules/metro/src/lib/transformHelpers.js:267:42
    at Server.<anonymous> (~/workspace/monorepo-sample/node_modules/metro/src/Server.js:1088:41)
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (~/workspace/monorepo-sample/node_modules/metro/src/Server.js:99:24)
    at _next (~/workspace/monorepo-sample/node_modules/metro/src/Server.js:119:9)
    at processTicksAndRejections (internal/process/task_queues.js:94:5)
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1