JavaScript コードから実行ファイル (.exe) を作成する方法 (Node.js を使用)

Creating An Executable

このデモでは、pkg コマンドライン ツールを使用します。 nexe や他のツールでも構いませんが、私は pkg の方が使いやすいと思います。 まず、pkgnpmコマンドでグローバルにインストールする必要があります。

$ npm install --global pkg
(source: gist.github.com)

パッケージをグローバルにインストールしたら、実行ファイルを作成する pkg コマンドを入手します。 pkg コマンドは、生成された実行ファイルをユーザーがダブルクリックしたときに実行されるエントリー JavaScript プログラムである入力ファイルを必要とします。

Entry File

入力ファイルのパスは、$ pkg server.jsコマンドのような<input>引数で提供されます(ローカルファイルのパス)。 しかし、package.jsonにパスを指定することもでき、pkgコマンドはpackage.jsonbinプロパティを使用してエントリーJavaScriptファイルのパスを検索します。 もしディレクトリのパスが提供された場合、pkg コマンドはそのディレクトリの package.json ファイルをその bin プロパティを使用して探します。

Assets

Assets は、.html, .js, .css, .png, .json ファイルなど実行ファイルに含まれていなければならない静的リソースです。 このようなファイルをpkgに指示するためには、package.jsonpkg.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.jsonpkg.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.jsonbinプロパティを使用することにします。 また、server.jsはこれに依存しているので、node_modulessrc内のすべてのファイルパスを静的アセットとして記述します。

(source: gist.github.com)

バイナリ実行ファイルを生成するために、pkg .コマンドを実行します。これは、pkgに入力ファイル、アセット、ターゲットを見つけるために、現在のディレクトリのpackage.jsonファイルを使用してもらいたいからです。 このコマンドが実行されると、pkgtargets の値に基づいて適切な Node.js バイナリをダウンロードし、環境変数 PKG_CACHE_PATH で指定されたディレクトリにそれらをキャッシュし、次回同じターゲットが発生したときに pkg がキャッシュされたバイナリ ファイルを使用できるようにします。 これらのファイルのファイル名と拡張子は pkg によって決定され、通常は <package>-<target>.<ext> のようになります。packagepackage.jsonname 値です。

しかしながら、--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ドライバが表示されます。

コメントを残す

メールアドレスが公開されることはありません。