【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