Electronでネイティブを実行できるnode-ffiを利用できるようになるまで
はじまりはじまり
node-ffiというライブラリがある。
これを使うと、ネイティブなライブラリ・フレームワークを
JavaScriptのコードから呼び出せる。
https://github.com/node-ffi/node-ffi
なのですが、Electronから使う場合、npmでnode-ffiを入れるだけでは、
動作しないことがほとんどなのであった。
↓のようなエラーが出たり(もちろんネイティブは呼び出せない)、そもそもElectronアプリが起動しなかったり。
was compiled against a different Node.js version using NODE_MODULE_VERSION 64. This version of Node.js requires NODE_MODULE_VERSION 57. Please try re-compiling or re-installing the module (for instance, using `npm rebuild` or `npm install`). at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:172:20) at Object.Module._extensions..node (module.js:598:18) at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:186:18) at Module.load (module.js:503:32) at tryModuleLoad (module.js:466:12) at Function.Module._load (module.js:458:3) at Module.require (module.js:513:17) at require (internal/module.js:11:18)
ちなみに環境はMacですぞ。
どうするどうする?
こうすれば絶対大丈夫、というのは、まだよく分からない。
何度か同じ問題と戦っているけど、
一度成功するパターンを掴んだら、そこで問題の追跡止めちゃうからね。仕方ないね。
以下は、最新の成功パターンである。
バージョンを決める
いろいろな理由があって、入れるバージョンは、このバージョンになった。
Electron 3系は、Nodeは10.2。
Electron 3なので、Spectron 5.0。
electron-packagerは12.1.0以降でないとダメ。
- Electron 3.1.1
- Node 10.2.1
- Spectron 5.0.0
- electron-packager 12.1.0
node 10.2.1を入れる
nvmでnodeをインストールする。
nvm ls-remote
nvm install v10.2.1
nvm use v10.2.1
npmでelectronを入れる
electron-packagerもついでに入れる。
npm install --save-dev electron@3.1.1 spectron@5.0.0 electron-rebuild electron-packager@12.1.0
node-ffi関連のライブラリを入れる
ffiを使うには、natives、bindings、debug、ms、nan、ref、ref-structあたりが必要になる。
bindings、ms、debugは直接入れなくても平気ではないか説ある。
(でも、今試しにbindings、ms、debug抜いたら、ビルドエラーになっちゃった)
npm install --save natives bindings debug ffi ms nan ref ref-struct
TypeScriptを使っているなら、定義ファイルも入れておきましょう。
npm install --save-dev @types/ffi @types/ref @types/ref-struct
ffi関連ライブラリをビルドする
electron-rebuildコマンドでnodeのライブラリをビルドする。
環境構築が上手く行かないときは、ここのビルドが失敗することが多いと思う。
./node_modules/.bin/electron-rebuild
動作確認
これでElectronアプリが起動して、
かつ、変なエラーログが出ていなければ、成功です。
Let's enjoy node-ffi.
./node_modules/.bin/electron .
おわり
おわり。