![**Gleam アプリを単一の実行ファイルにまとめる手順**
Gleam アプリケーションを1つのスタンドアロンバイナリとして配布したい場合、以下のステップで進めます。
---
### 1. プロジェクトをコンパイル
```bash
gleam build --release
```
`./_build/default/gleam` に最適化された成果物が生成されます。
### 2. Erlang リリースを作成(任意)
追加の Erlang 依存関係をバンドルしたい場合は、次のようにリリースを作ります。
```bash
rebar3 as prod tar
```
### 3. Mix を使って配布設定
`mix.exs` に Gleam コンパイラを追加し、リリースを構成します。
```elixir
def project do
[
app: :my_app,
version: "0.1.0",
elixir: "~> 1.14",
start_permanent: Mix.env() == :prod,
deps: deps(),
escript: escript_config()
]
end
defp escript_config do
[
main_module: MyApp.CLI,
# Gleam コードを先にコンパイルするよう指示
extra_applications: [:gleam]
]
end
```
### 4. 実行ファイルの生成
```bash
mix escript.build
```
生成されたバイナリ(`my_app`)は `./_build/dev/rel/my_app/bin` に配置されます。
### 5. バイナリをテスト
```bash
./_build/dev/rel/my_app/bin/my_app --help
```
### 6. 配布
- バイナリと必要な設定ファイルをターゲットマシンへコピーします。
- 標準の Erlang/Elixir ランタイム以外に実行時依存はありません。
---
## 主なポイント
- **`gleam build --release`** で本番用の Gleam アーティファクトを作成。
- Mix の **`escript.build`** がコンパイル済みコードを単一バイナリにまとめます。
- このバイナリは、同じ Erlang/Elixir バージョンが動く環境ならどこでも実行可能です。](/_next/image?url=%2Fscreenshots%2F2026-03-03%2F1772492742820.webp&w=3840&q=75)
2026/03/03 1:20
**Gleam アプリを単一の実行ファイルにまとめる手順** Gleam アプリケーションを1つのスタンドアロンバイナリとして配布したい場合、以下のステップで進めます。 --- ### 1. プロジェクトをコンパイル ```bash gleam build --release ``` `./_build/default/gleam` に最適化された成果物が生成されます。 ### 2. Erlang リリースを作成(任意) 追加の Erlang 依存関係をバンドルしたい場合は、次のようにリリースを作ります。 ```bash rebar3 as prod tar ``` ### 3. Mix を使って配布設定 `mix.exs` に Gleam コンパイラを追加し、リリースを構成します。 ```elixir def project do [ app: :my_app, version: "0.1.0", elixir: "~> 1.14", start_permanent: Mix.env() == :prod, deps: deps(), escript: escript_config() ] end defp escript_config do [ main_module: MyApp.CLI, # Gleam コードを先にコンパイルするよう指示 extra_applications: [:gleam] ] end ``` ### 4. 実行ファイルの生成 ```bash mix escript.build ``` 生成されたバイナリ(`my_app`)は `./_build/dev/rel/my_app/bin` に配置されます。 ### 5. バイナリをテスト ```bash ./_build/dev/rel/my_app/bin/my_app --help ``` ### 6. 配布 - バイナリと必要な設定ファイルをターゲットマシンへコピーします。 - 標準の Erlang/Elixir ランタイム以外に実行時依存はありません。 --- ## 主なポイント - **`gleam build --release`** で本番用の Gleam アーティファクトを作成。 - Mix の **`escript.build`** がコンパイル済みコードを単一バイナリにまとめます。 - このバイナリは、同じ Erlang/Elixir バージョンが動く環境ならどこでも実行可能です。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この記事では、Gleam プロジェクトを単一の実行ファイルに変換する方法について説明しています。Gleam 自体は Erlang または JavaScript にしかコンパイルできず、ネイティブバイナリを生成しないためです。
- セットアップ –
を実行して Gleam をインストールし、新しいプロジェクトを作成します(gleam install
)。gleam new <project_name> - ビルド –
またはgleam build --target=erlang
のいずれかでプロジェクトをコンパイルします。ターゲットに応じて、どのパッケージング手順を採用するかが決まります。gleam build --target=javascript
Erlang ターゲット
- Gleescript は Erlang の stdlib を使って escript をバンドルします。
を実行し、ビルド後にgleam add gleescript
で escript 実行ファイルを生成します。この結果得られるバイナリはホストマシン上に Erlang VM が必要です。gleam run -m gleescript - Burrito は BEAM コードを自己解凍アーカイブに包み、Erlang ランタイムなしで実行できるようにしますが、現在 Gleam との互換性は未テストです。
JavaScript ターゲット
でビルドします。gleam build --target=javascript- 生成された
をバンドル(例:Esbuild)。bundle.cjs - 実行ファイルに変換します:
- Deno compile (
) –deno compile bundle.cjs
や権限オーバーライドなどのフラグを追加でき、Deno ランタイムを埋め込むため約 100 MB の大きなバイナリが生成されます。--target=<arch> - Node SEA(Node v23+で実験的) – sea‑config ファイルと blob 注入が必要で、CommonJS のみサポート。自己完結型の実行ファイルを作成します。
- Bun build --compile – Bun 自身のランタイムを含む高速バンドルで、同様に約 100 MB の大きなバイナリが生成されます。
- Nexe – Node.js を実行ファイルへ変換する別ツールですが、Gleam との互換性はまだ完全には検証されていません。
- Deno compile (
記事では、Deno/Bun 実行ファイルのランタイムフットプリントが大きいことや、未テストの組み合わせ(例:Burrito + Gleam)などの注意点を指摘しています。また、将来の更新でプラットフォームサポートが拡張されたり、ビルドプロセスが簡素化される可能性があると示唆しています。最終的に、これらのツールは開発者が Gleam アプリケーションを単一バイナリとして配布できるようにし、エンドユーザーへのデプロイを容易にするとともに、クロスプラットフォームでの配布も簡便化します。
本文
目次
- Gleam プロジェクトの作成について
- 実行ファイルを作る方法
- Erlang ターゲット
- Gleescript(システムErlangが必要)
- Burrito
- JavaScript ターゲット
- Deno compile
- Node SEA
- Bun build —compile
- Nexe
- Erlang ターゲット
- 結論
Gleamについて
Gleam は Erlang と JavaScript にコンパイルされる比較的新しい関数型言語です。Rust のような構文を持ち、Elm の複雑さと楽しく作業できる点が特徴です。
問題は、Gleam では実行ファイル(バイナリ)をネイティブに生成する機能がないことです。本ガイドでは、様々な手段で Gleam 実行ファイルを作成し、そのメリットと注意点を解説します。私の WIP プロジェクトを例にプロセスを示します。
Gleam プロジェクトの作成
- Gleam をインストール – 公式手順を ここ に従ってください。
- 新規プロジェクトを作る
gleam new <project_name> - ビルドする
ターゲットは生成される出力と、実行ファイルにパッケージ化する方法を決定します。gleam build --target=erlang|javascript
実行ファイル作成の手段
Erlang ターゲット – Gleescript(システムErlangが必要)
Gleescript は Erlang の
escript モジュールを使って単一の escript をバンドルします。Erlang VM がインストールされている任意のマシンで実行可能です。ただし、古い VM では新しい bytecode がサポートされないことがあるため、1〜2世代以内に留めると安全です。
手順
- Gleescript を依存関係として追加
gleam add gleescript - Erlang 用にビルド
gleam build --target erlang - escript を作成
gleam run -m gleescript - 実行ファイルを起動
./your_project
Burrito
Burrito は Elixir アプリケーションを BEAM バーニャっとに包み、コンパイル済み BEAM コードと必要な ERTS を含む自己解凍アーカイブを生成します。Windows、macOS、Linux で動作します。
Gleam と Burrito の組み合わせはまだ完全にはテストしていませんが、まず escript に変換した後にラップすることで動く可能性があります。
JavaScript ターゲット
Deno compile
Deno の
compile コマンドは、Deno ランタイムをバンドルした単一の実行ファイルを生成します。ただし、Gleam が出力する JS を Webpack/Parcel/Rollup/Esbuild などで1つにまとめる必要があります。
手順
- JavaScript 用にビルド
gleam build --target=javascript - Esbuild でバンドル
esbuild \ build/dev/javascript/<project_name>/<project_name>.mjs \ --platform=node \ --minify-whitespace --minify-syntax \ --bundle \ --outfile=bundle.cjs \ --format=cjs \ --footer:js="main();" - 実行ファイルにコンパイル
deno compile \ --target=<target_architecture> \ --output <executable_name> \ bundle.cjs
実行ファイルがファイルシステムやネットワークアクセスを必要とする場合は、適切な権限を付与してください。
Node SEA(Single Executable Applications)
Node の実験的 SEA 機能は、Node.js アプリを単一の実行ファイルにバンドルし、Node がインストールされていなくても動作させます。ただし CommonJS モジュールのみ対応しています。
手順
- JavaScript 用にビルド
gleam build --target=javascript - Esbuild でバンドル(上記と同じコマンド)。
を作成(main と output フィールドが必須)。sea-config.json- SEA バイオを生成
node --experimental-sea-config sea-config.json - Node のバイナリをコピーし、バイオを注入
cp $(command -v node) <executable_name> npx postject <executable_name> NODE_SEA_BLOB <output>.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 - (任意)バイナリを署名し、実行
./<executable_name>
この手順でセグメンテーションフォルトが発生したため、更なる調査が必要です。
Bun build —compile
Bun の
--compile フラグは JS ファイルをバンドルし、外部バンドラーなしで単一の実行ファイルにコンパイルします。Deno と同様ですが、設定が簡潔です。
手順
- JavaScript 用にビルド
gleam build --target=javascript - Bun でコンパイル
bun build \ --compile \ --outfile=bundle \ build/dev/javascript/<project_name>/<project_name>.mjs \ --footer="main();"
Bun は非常に便利で高速です。
Nexe
Nexe は Node.js アプリを単一の実行ファイルにコンパイルします。Gleam との組み合わせはまだテストしていませんが、概念的には簡単に利用できるはずです。
結論
使ったツール・ライブラリの中で Bun が最も高速かつ扱いやすく判明しました。Bun と Deno のバンドルランタイムは実行ファイルサイズが大きくなる(通常 100 MB を超える)点だけ注意が必要です。非本番用途なら問題ありませんが、配布を考慮する場合はこの点を念頭に置いてください。