今回は、 Node.js アプリケーションのシングルバイナリ化をやってみる。
対象のアプリケーションは devcontainers/cli。
nexe/nexe と Node.js v21 の Single executable applications の 2 パターンでやってみる。
前提
- OS: Windows 11 Pro 23H2 ビルド 22631.3155
- Docker Desktop: Version 4.28.0 (139021)
- 使用イメージ: mcr.microsoft.com/windows/servercore:ltsc2022
コンテナ起動
Node.js のビルドにはたくさんメモリが必要なので、 -m
で明示的に指定。
docker run -it --rm --cpus 20 -m 16G -v "$(pwd):C:\dist" mcr.microsoft.com/windows/servercore:ltsc2022 powershell.exe
ビルド環境構築
開発ツール一式をインストール
Set-ExecutionPolicy Unrestricted -Force
iex ((New-Object System.Net.WebClient).DownloadString('https://boxstarter.org/bootstrapper.ps1'))
get-boxstarter -Force
Install-BoxstarterPackage https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter -DisableReboots
refreshenv
Visual Studio に必要なコンポーネントを追加
& 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe' modify `
--installPath 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools' `
--add Microsoft.VisualStudio.Component.Windows11SDK.22621 `
--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
--add Microsoft.VisualStudio.Component.VC.Runtimes.x86.x64.Spectre `
--quiet
Node.js のインストール
choco install nodejs
パス環境変数の更新
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
devcontainers/cli
をシングルバイナリにしてみる
nexe/nexe
で作る
git clone --depth 1 -b v0.58.0 https://github.com/devcontainers/cli devcontainers-cli
cd devcontainers-cli
npm i -g yarn
yarn
yarn compile-prod
npx nexe -i ./devcontainer.js -t windows-x64-21.7.1 -b -o /dist/devcontainer-windows-x64-21.7.1-nexe.exe
~\.nexe\21.7.1\out\Release\node.exe
に nexe 向けの
node.exe
が配置される。 これを
~\.nexe\windows-x64-21.7.1
に移動し、 -b
を外すことで、次回以降、このバイナリを利用してシングルバイナリを作るようになる。
mv ~\.nexe\21.7.1\out\Release\node.exe ~\.nexe\windows-x64-21.7.1
Node.js の Single executable applications で作る
# シングルバイナリに使うための node 実行ファイルをコピー
Copy-Item 'C:\Program Files\nodejs\node.exe' .\devcontainer-windows-x64-21.7.1-sea.exe
# sea 用の設定ファイル作成
Write-Output '{"main": "./dist/spec-node/devContainersSpecCLI.js", "output": "sea-prep.blob"}' | Out-File -Encoding ascii .\sea-config.json
# blob の作成
node --experimental-sea-config sea-config.json
# BLOB を注入し、シングルバイナリを作る
npx postject devcontainer-windows-x64-21.7.1-sea.exe NODE_SEA_BLOB sea-prep.blob `
--sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
# コンテナの外にコピー
Copy-Item .\devcontainer-windows-x64-21.7.1-sea.exe \dist
参考資料
- nexe/nexe: 🎉 create a single executable out of your node.js apps
- devcontainers/cli: A reference implementation for the specification that can create and configure a dev container from a devcontainer.json.
- Single executable applications | Node.js v21.7.1 Documentation
変更履歴
日付 | 内容 |
---|---|
2024/3/23 | 新規作成 |
2024/4/2 | nexe 用 node
バイナリ格納場所の間違いを修正(~/nexe ->
~/.nexe ) |
0 件のコメント:
コメントを投稿