【RN】Nodebrew環境でArchiveするとnodeが見つからない
概要
この記事はReact Nativeアドベントカレンダーの2日目の記事です。
今回はNodebrew
を使ってReact Native
を開発している中でぶち当たるエラーについて紹介します。
本業でJavascript
をゴリゴリ書くスタイルを取っている方だと、Node
のバージョンを切り替えるためにNodebrew
などを利用しているケースも多いかなと思います。
上記のように、通常の手順通りにNode
を入れていない場合はReact Native
アプリをビルドする際に少し気をつけることがあるので参考になれば幸いです。
そもそもNodebrewって何?
Nodebrew
はMacOS
で動作するNode
のバージョン管理ツールです。
開発する要件ごとに使用するNode
のバージョンが異なる場合などに重宝します。
インストールする方法はいくつかありcurl
で叩く方法やHomebrew
なんかを使用する方法もあります。
インストールすると以下のような感じで「切り替え可能なバージョン」が確認でき、適宜スイッチすることができます。
nodebrew ls-all
remote:
v0.0.1 v0.0.2 v0.0.3 v0.0.4 v0.0.5 v0.0.6
...略
current: v16.5.0
上記の場合v16.5.0
を使用しています。
これを例えば
nodebrew install-binary v8.0.0
のような感じでv8.0.0
をインストールして
nodebrew use v8.0.0
とすることでスイッチできます。
他にも同様のツールはいくつかあるので、必ずしもNodebrew
が最適解ではないと思います。
あと、Docker
を使ってる場合もNode
のバージョン含めて環境を切り分けられるので、このあたりのツールとは無縁かもしれません。
ReactNativeでiOSアプリをArchiveする際に起きるエラー
Nodebrew
自体はNode
のバージョン管理ができ、かつバージョン間でグローバルを汚染しないので便利なのですが、React Native
で開発する際は少し困ります。
具体的にはiOS
のアプリをArchive
しようとする時に以下のエラーが起きます。
Can’t find the ‘node’ binary to build the React Native bundle. If you have a non-standard Node.js installation, select your project in Xcode, find ‘Build Phases’ – ‘Bundle React Native code and images’ and change NODE_BINARY to an absolute path to your node executable. You can find it by invoking ‘which node’ in the terminal.
翻訳は以下の通りです。
ReactNativeバンドルを構築するための「ノード」バイナリが見つかりません。非標準のNode.jsがインストールされている場合は、Xcodeでプロジェクトを選択し、「ビルドフェーズ」-「BundleReact Nativeコードとイメージ」を見つけて、NODE_BINARYをノード実行可能ファイルへの絶対パスに変更します。ターミナルで「どのノード」を呼び出すと、それを見つけることができます。
本来あるはずのnode
が見つからないようです。
対処法
エラーの中にも記載してある通り、Xcode
からビルド時のスクリプトを少し変える必要があります。
具体的にはXcode
上でプロジェクトを選択し【Build Phases】→【Bundle React Native code and images】を参照します。
デフォルトでは以下のようになっていると思います。
export NODE_BINARY=node
../node_modules/react-native/scripts/react-native-xcode.sh
このNODE_BINARY
のパスをNodebrew
ライクに切り替えます。
export NODE_BINARY=$HOME/.nodebrew/current/bin/node
../node_modules/react-native/scripts/react-native-xcode.sh
これでArchive
が通るようになりました。
まとめ
今回は自分がNodebrew
環境でArchive
する際に遭遇したエラーと対処法について紹介しました。
製品をそこまで頻繁にリリースする仕事をしていないせいか、知ってはいるけど発生するたびに「あれ、これどうすればいいんだっけ?」となりがちなエラーです。
ある種自分への備忘録の意味も込めて記事にしました。
今回の内容が少しでも役立てば幸いです。
Discussion