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がオススメ