Creating An Executable
このデモでは、pkg
コマンドライン ツールを使用します。 nexe
や他のツールでも構いませんが、私は pkg
の方が使いやすいと思います。 まず、pkg
をnpm
コマンドでグローバルにインストールする必要があります。
$ npm install --global pkg
パッケージをグローバルにインストールしたら、実行ファイルを作成する pkg
コマンドを入手します。 pkg
コマンドは、生成された実行ファイルをユーザーがダブルクリックしたときに実行されるエントリー JavaScript プログラムである入力ファイルを必要とします。
Entry File
入力ファイルのパスは、$ pkg server.js
コマンドのような<input>
引数で提供されます(ローカルファイルのパス)。 しかし、package.json
にパスを指定することもでき、pkg
コマンドはpackage.json
のbin
プロパティを使用してエントリーJavaScriptファイルのパスを検索します。 もしディレクトリのパスが提供された場合、pkg
コマンドはそのディレクトリの package.json
ファイルをその bin
プロパティを使用して探します。
Assets
Assets は、.html
, .js
, .css
, .png
, .json
ファイルなど実行ファイルに含まれていなければならない静的リソースです。 このようなファイルをpkg
に指示するためには、package.json
のpkg.assets
プロパティでこれらのファイルのパスを提供する必要がある。
💡 この場合、
package.json
は、pkg
が実行ファイルに含める必要があるassets
を選択できるように、入力パスでなければなりません。
実行ファイルが作成されると、pkg
は入力 JavaScript ファイルと、1 つの実行ファイル内の静的アセットを含めます。 ここで少し複雑なことが起こります。 すべてのプロジェクト ファイルが 1 つのファイルにパックされているため、相対ファイル パスは意味を失い、フォルダ構造も同様です。
しかし、ランタイム (実行可能ファイルが実行されているとき) には、これらのファイルはスナップショット ファイル システムという仮想ファイル システムに組織化されます。 通常、実行時のこれらのファイルは、システムの /snapshot
ディレクトリ内にあるかのように /snapshot/
(または Windows では C:\snapshot\
) というプレフィックスをパスに持ちます。
しかし、path.join
メソッドと __dirname
変数を使用して path.join( __dirname, './www/main.js' )
などの相対パスを構築すれば、実行ファイル内の資産ファイルを安全に見つけることができます(実行時のパス)。 このパスは、実際のファイルシステム内のディレクトリパスと同じように機能します。 スナップショットファイルシステムについてより詳しく知るには、このドキュメントを読んでください。
💡注意してください。 コンパイル時に
pkg
はコード内のrequire()
ステートメントを調べ、これらのファイルを静的資産として自動的にインクルードします。 そのため、package.json
でそのようなファイルを静的アセットとして指定する必要がない場合があります。
Targets
コマンドライン・フラグ --targets
を使用すると、特定のシステム用の実行ファイルを生成することができます。 このフラグの値は <node>-<platform>-<arch>
形式の文字列である。 また、複数のシステム・アーキテクチャをターゲットにするために、このパターンをカンマで区切ったリストとすることも可能である。 また、package.json
の pkg.targets
フィールドを使用してこれらの値を指定することもできます。
node
値は、Node のターゲット・メジャー・バージョンです。 platform
値はターゲットオペレーティングシステムの名前で、これらの freebsd, linux, alpine, macos, win
のいずれかになります。 arch
値はターゲットプロセッサアーキテクチャで、これらのx64, x86, armv6, armv7
のいずれかになります。
ターゲット仕様からこれらの値のいずれかを省略することができます。 その場合、pkg
は現在のシステム構成からその値を使用する。 --targets
の値として 'host'
を使用することもでき、その場合、これらの値はすべて現在のシステム構成から取得されます。
Output
macOS と Windows OS、特に x64
プロセッサ アーキテクチャ用の実行ファイルの作成に挑戦してみましょう。 エントリポイントはserver.js
なので、そのファイルパスを示すためにpackage.json
のbin
プロパティを使用することにします。 また、server.js
はこれに依存しているので、node_modules
とsrc
内のすべてのファイルパスを静的アセットとして記述します。
バイナリ実行ファイルを生成するために、pkg .
コマンドを実行します。これは、pkg
に入力ファイル、アセット、ターゲットを見つけるために、現在のディレクトリのpackage.json
ファイルを使用してもらいたいからです。 このコマンドが実行されると、pkg
は targets
の値に基づいて適切な Node.js バイナリをダウンロードし、環境変数 PKG_CACHE_PATH
で指定されたディレクトリにそれらをキャッシュし、次回同じターゲットが発生したときに pkg
がキャッシュされたバイナリ ファイルを使用できるようにします。 これらのファイルのファイル名と拡張子は pkg
によって決定され、通常は <package>-<target>.<ext>
のようになります。package
は package.json
の name
値です。
しかしながら、--output
または --out-path
オプション値を使って命名規則と出力ディレクトリを制御することができます。 ここでは、--output
フラグを使用して、出力ディレクトリと実行ファイルの名前を指定します。
$ pkg --output build/web .
上記のコマンドは、build
ディレクトリ内に次のファイルを生成します。
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
ここで、これらのファイルのいずれかをダブルクリックすると、デフォルトのシステムブラウザでウェブページが開き、式1ドライバが表示されます。