node.js pkgで1ファイル実行ファイル化
Node.jsでプログラムを配布する際にいちいちNode.jsやパッケージファイルを一緒に提供する必要があるとかなり管理が大変になる。もちろん,JavaScriptのアプリケーションだけがたくさん種類がある場合にはこの限りではないが,一つのアプリを提供するのにファイルがたくさんあるのはあまりやりたくない。
具体的な方法は,pkgを使うということ。
npm install -g pkg
でインストールをする。
これだけで例えばexpressのサーバserv.jsなどを作っていた場合,
pkg serv.js
で実行ファイルが作り始められる。
(npm install -D pkgとした場合にはnpx pkg serv.js)
この時,なにも指定していなければWindows用かLinux用かx86/x64など実行環境を見分けてそれぞれ用に1ファイル化が行われる(ただしx86とx64をまたいで1ファイル化は行われない)。
今回の例
const express = require('express'); const app = express(); app.use(express.static('./')); app.listen(80, ()=> { console.log('Express Server 01'); });
さて,普通がserv.jsにrequireで指定したモジュールもひとまとめにされるのだが,少し癖があって必要なモジュールが抜けることがある。
できれば
npm init -y
でpackage.jsonを用意して,
npm install -D xxxx
でそのアプリケーションの実行に必要なバージョンのモジュールを固めておくとよい(と思う)。
ただし,ほかのアプリケーション用のpackage.jsonのあるフォルダでpkgコマンドを実行すると失敗する可能性がある。
ちなみに上のコマンドnode10-win64ならserv-win.exeができた。
(2018.10.04追加: 一応,上例ではこの操作でserv-linux/serv-macosも出来ている。もし,ターゲットが固定されていれば--target=node10-win-x64を指定してほしい。pure javascriptでないものが混ざるなどserv-linuxやserv-macosが作れない事情があると失敗するらしい)
うまくできた仕組みである。
上の例ではどこが./かは注意。
ショートカットを作って起動する場合には作業フォルダの指令を忘れないでおかないと意図しないフォルダが露出してしまう