カテゴリー
【nodejsシェルアプリ開発】Node.jsのSEA(Single Executable Applications)を試してみよう
※ 当ページには【広告/PR】を含む場合があります。
2024/08/21
pkg has been deprecated with 5.8.1 as the last release.
There are a number of successful forked versions of pkg already with various feature additions.
Further, we’re excited about Node.js 21’s support for single executable applications.
Thank you for the support and contributions over the years.
The repository will remain open and archived.
SEAのビルド手順
esbuild
エントリーポイントとなるJSファイル(CJS)を作成する
index.js
「sea-config.json」からblobファイルを生成する
sea-config.json
{
"main": "index.js",
"output": "sea-prep.blob"
}
sea-config.json
$ node --experimental-sea-config sea-config.json
生node(実行ファイル)をコピー&アプリケーション名に変更
「snake-game」
#Windows以外のOS
$ cp $(command -v node) snake-game
#Windowsで作業する場合
$ node -e "require('fs').copyFileSync(process.execPath, 'snake-game.exe')"
snake-game
$ ./snake-game
Welcome to Node.js v22.6.0.
Type ".help" for more information.
>
バイナリからシグネチャを外す(macOSかWindowsのみ)
「postject」
#macOSの場合
$ codesign --remove-signature snake-game
#Windowsの場合(オプション)
#※signtoolはWindows SDKに同梱されるツール
$ signtool remove /s snake-game.exe
「postject」ツールでコピーしたバイナリにblobをインジェクションする
$ postject <注入先のnodeバイナリ> NODE_SEA_BLOB <注入するblob>
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2:
Node.jsプロジェクトの使う固有フューズ(各OS共通)
--macho-segment-name NODE_SEA:
(macOSのみ)blobの格納されるバイナリのセグメント名
#Linuxの場合
$ npx postject snake-game NODE_SEA_BLOB sea-prep.blob \
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
#Windows(PowerShell)の場合
$ npx postject snake-game.exe NODE_SEA_BLOB sea-prep.blob `
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
#Windows(コマンドプロンプト)の場合
$ npx postject snake-game.exe NODE_SEA_BLOB sea-prep.blob ^
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
#macOSの場合
$ npx postject snake-game NODE_SEA_BLOB sea-prep.blob \
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
--macho-segment-name NODE_SEA
バイナリにシグネチャをつけ直す(macOSかWindowsのみ)
#macOSの場合
$ codesign --sign - snake-game
#Windowsの場合(オプション):
$ signtool sign /fd SHA256 snake-game.exe
バイナリを実行してみる
#Windows以外
$ ./snake-game
#Windowsの場合
$ .\snake-game.exe
(node:12582) ExperimentalWarning: Single executable application is an experimental feature and might change at any time
(Use `snake-game --trace-warnings ...` to show where the warning was created)
ExperimentalWarning
$ NODE_NO_WARNINGS=1 ./snake-game
DockerコンテナでLinuxターゲットのビルド環境は整える場合の注意点
Single-executable support is tested regularly on CI only on the following platforms:
Windows
macOS
Linux (all distributions supported by Node.js except Alpine and all architectures supported by Node.js except s390x)
This is due to a lack of better tools to generate single-executables that can be used to test this feature on other platforms.
まとめ
pkg
SEA
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー