CLOVER🍀

That was when it all began.

Node.jsアプリケーションを、実行可能ファイルにまとめるnexeを試す

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とは

機能は、こちらに書いてあります。

Motivation and Features

あたりが個人的にはポイントです。

実行する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のバージョンを選ぶことができます。

NexeOptions

デフォルトは、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

確認結果は、省略します。

覚えておきましょう。