GitHub風進捗グラフAPIサービスPixelaのReact Nativeアプリを開発している。特に気にせず最新版のNode.js v11.7.0を利用していたのだけれど、Realmのインストール時に問題が起きたのでメモ。
[Realm v2.22.0はNode.js v11.x非対応]
npm install realm --save-devとコマンドを実行すると、次のエラーが出た。
In file included from ../src/node/node_init.hpp:29:
../src/node/node_class.hpp:373:10: error: called object type 'int' is not a
function or function pointer
F(isolate, info.This(), property, return_value);
~^
8 errors generated.
make: *** [Release/obj.target/realm/src/node/node_init.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:262:23)
gyp ERR! stack at ChildProcess.emit (events.js:188:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:254:12)
...(略)...
gyp ERR! node -v v11.7.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok
node-pre-gyp ERR! build error
...(略)...
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! realm@2.22.0 install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the realm@2.22.0 install script.
...(略)...
node install errorでググるとissueが見つかった。
以前はNode.js v10.xでも同様のエラーが発生していたが、今は対応された、ということらしい。そのまま探していくと、果たしてNode 11のサポートに関するチケットも見つかった。
どうやら昨年適当にバージョンを上げたのが悪さをしているらしい。
[RealmはLTSのNode.jsをサポート]
Prerequisites ・Node 6, 8, and 10 are supported.
公式サイトも確認すると、確かにNode.js v6.x, v8.x, v10.xをサポートしていると書かれている。先ほどのissueにも書かれているように、LTSのNodeはサポートしてやるから、それ以外のメジャーバージョンは使うな、ということらしい。
Node.js v6.xのサポートが2019年4月末で終わり、Node.js v12.xのサポートが2019年10月にスタートするので、恐らく10月以降にNode.js v11.xでもRealmを利用できるようになるだろう。
RealmやReact Nativeの世界とは完全に別件だが、2018年4月末にサポート終了を迎えたNode.js v4.xは、半年ほどかけてAWS Lambdaでもランタイムとして使えなくなったので、Node.js v6.xも同様に2019年後半には使えなくなりそう。
[nでNode.jsをLTSにダウングレード]
本題に戻す。Realmを使いたいのでNode.jsをv10.xにダウングレードしたい。Node.jsのバージョン管理といえばnvmだのnodebrewだの色々あるのは知っている。
既にNode.jsがインストールされている環境(macOS 10.14.2)なので、アンインストールしたりするのは嫌だな、と思いながらググっていると、nを使うと良さそうという回答を見つけたので試してみることに。
Githubで確認すると、やはりインストールしてすぐ使えそうに見える。
まずはnpm install -g nを実行してnをインストールする。
~/Develop/pixelarn akito$ npm install -g n /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n + n@2.1.12 added 1 package from 4 contributors in 0.965s
次に、nを利用してNode.jsをLTSの最新版に設定する。
~/Develop/pixelarn akito$ n 10.15.0
mkdir: /usr/local/n/versions/node: Permission denied
mkdir: /usr/local/n/versions/io: Permission denied
install : node-v10.15.0
mkdir : /usr/local/n/versions/node/10.15.0
mkdir: /usr/local/n/versions/node/10.15.0: Permission denied
Error: sudo required
失敗。sudoをつけてsudo n 10.15.0を実行する必要があった。
~/Develop/pixelarn akito$ sudo n 10.15.0
Password:
install : node-v10.15.0
mkdir : /usr/local/n/versions/node/10.15.0
fetch : https://nodejs.org/dist/v10.15.0/node-v10.15.0-darwin-x64.tar.gz
######################################################################## 100.0%
installed : v10.15.0
node -vコマンドでバージョンを確認すると確かにバージョンがv11.xから変更されていた。すでにインストール済みのNode.js v11.xと競合してエラーが発生したりはしないらしい。安心。
~/Develop/pixelarn akito$ node -v v10.15.0
ということで改めてRealmをインストールする。
~/Develop/pixelarn akito$ npm install realm --save-dev > realm@2.22.0 install /Users/akito/Develop/pixelarn/node_modules/realm > node-pre-gyp install --fallback-to-build node-pre-gyp WARN Using request for node-pre-gyp https download [realm] Success: "/Users/akito/Develop/pixelarn/node_modules/realm/compiled/node-v64_darwin_x64/realm.node" is installed via remote npm WARN react-native-elements@0.19.1 requires a peer of react-native-vector-icons@^4.2.0 but none is installed. You must install peer dependencies yourself. + realm@2.22.0 added 78 packages from 46 contributors and audited 35129 packages in 12.487s found 0 vulnerabilities
問題なくRealmをインストールすることができた。
[まとめ]
- Node.jsはLTSを使うと、ライブラリがサポートしていて無難
- Node.jsのバージョン管理はnがオススメ