Node.jsを使って作成したアプリケーションを、単一の実行可能ファイルにまとめる方法はないかなぁと思って
調べてみました。
deployment - How do I deploy Node.js applications as a single executable file? - Stack Overflow
nexeというものが、自分の要求にマッチしそうです。
GitHub - nexe/nexe: 🎉 create a single executable out of your node.js apps
Electronは、ちょっと違います。どちらかというと、CLIツールなどを対象にして使うようなものを想定しています。
というわけで、試してみるとしましょう。
nexeとは
機能は、こちらに書いてあります。
- Node.jsおよびnpmなしで実行可能なバイナリを作成する
- クロスプラットフォーム
あたりが個人的にはポイントです。
実行するNode.jsのバージョンを選ぶこともできるようです。
類似のものとしては、Pkgが該当しそうですね。
GitHub - zeit/pkg: Package your Node.js project into an executable
環境
確認環境は、以下の通りです。
$ node -v v9.5.0 $ npm -v 5.6.0
インストール
nexeのインストールは、ドキュメントの通り以下のコマンドで行います。グローバルにインストールして、CLIとして使いましょう、と。
$ npm install nexe -g
確認。
$ nexe -v 2.0.0-rc.24
お題
で、nexeを使ってアプリケーションを作るわけですが、簡単なcatコマンドライクなものを作りましょう。この時、Node.jsの標準APIのみではなくて
サードパーティ製のライブラリも使用することにします。
プロジェクト名は、ncatとしましょう。
$ mkdir ncat $ cd ncat $ npm init
ライブラリは、「fs-extra」を使用することにします。
$ npm install --save fs-extra
package.jsonでの依存関係は、このように。
"dependencies": { "fs-extra": "^5.0.0" }
アプリケーションの作成
対象のアプリケーションとなる、簡単なスクリプトを作成します。
こんな感じで。
index.js
const fs = require("fs-extra"); const fileName = process.argv.slice(2)[0]; fs.readFile(fileName, "utf-8", (err, data) => { console.log(data); });
確認。スクリプト自身を表示してみます。
$ node index.js index.js const fs = require("fs-extra"); const fileName = process.argv.slice(2)[0]; fs.readFile(fileName, "utf-8", (err, data) => { console.log(data); });
OKです。
実行可能ファイルを作る
では、実行可能ファイルを作成してみます。
$ nexe index.js ℹ nexe 2.0.0-rc.24 ✔ Compiling result ✔ Entry: 'index.js' written to: ncat ✔ Finished in 0.682s
「ncat」というファイルができたようです。
確認してみます。
$ ./ncat index.js const fs = require("fs-extra"); const fileName = process.argv.slice(2)[0]; fs.readFile(fileName, "utf-8", (err, data) => { console.log(data); });
OKそうですね。
出力ファイルのデフォルトの名前は、「name」(package.json?)の名前になるそうですが、「--output」オプションで指定できるようです。
ところで、サイズのほどですが、30Mオーバーとやたらでかいです…。
$ ls -lh ncat -rwxrwxr-x 1 xxxxx xxxxx 34M 2月 12 23:38 ncat
なんとなく、Node.js自体が入ってそうな気がしますね。
プラットフォーム?
出力する対象となるプラットフォームおよび、Node.jsのバージョンを選ぶことができます。
デフォルトは、processの情報が使われ、その内容のプラットフォームとNode.jsが選ばれるようです。
こちらを見よ、と。
https://github.com/nexe/nexe/blob/dev/test/target.spec.ts
つまり、今回はこれと同じです。
※「--output」は変えました
$ nexe index.js --output ncat-linux-x64 --target linux-x64-9.5.0
結果。
$ ls -l ncat ncat-linux-x64 -rwxrwxr-x 1 xxxxx xxxxx 35296333 2月 12 23:38 ncat -rwxrwxr-x 1 xxxxx xxxxx 35296333 2月 12 23:46 ncat-linux-x64
では、Windows版を作ってみましょう。
対象のプラットフォームとNode.jsのバージョンは、こちらを見るとわかります。
Releases · nexe/nexe · GitHub
…つまり、Node.js全部入りですね、これは。
作成。
$ nexe index.js --output ncat-win-x64 --target windows-x64-9.5.0
これで、Windows用のバイナリが作成できました。
$ ls -lh ncat-win-x64.exe -rwxrwxr-x 1 xxxxx xxxxx 22M 2月 12 23:52 ncat-win-x64.exe
確認結果は、省略します。
覚えておきましょう。