Go・Rust アプリの Windows インストーラー(どの OS からでもクロスコンパイル)
Go や Rust のプログラムを Windows 向けにクロスコンパイルし、アイコンを埋め込み、GUI アプリではコンソールを非表示にして、単一の .exe(と付属アセット)をショートカットとアンインストーラー付きの Setup.exe にまとめる方法。
更新日 2026年10月31日 · 読了 5 分
Go と Rust はどちらも、Mac や Linux マシンから Windows 向けの静的リンクされた単一の .exe を生成できます。これがデスクトップツールで両言語が好まれる大きな理由です。それでもユーザーは、その .exe をダウンロードフォルダーに置いたままにするのではなく、インストールすることを期待します。このガイドでは、重要なビルドフラグと、テストの段階まで Windows に触れずにバイナリを Setup.exe にする方法を解説します。
Go
環境変数でターゲットを指定してクロスコンパイルします。
GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o MyApp.exe .
-s -wはシンボルテーブルとデバッグ情報を取り除き、バイナリを小さくします。- GUI アプリ(Fyne、Wails、Walk、webview など)では、コンソールウィンドウが開かないように
-ldflagsの中に-H windowsguiを追加します:-ldflags "-s -w -H windowsgui"。 - 32 ビット版は
GOARCH=386、Windows on ARM はarm64を指定します。
アイコンとバージョン情報。 Go には Windows アイコンを埋め込む標準の手段がありません。go-winres は、短い JSON の定義と .ico から .syso リソースファイルを生成します。その .syso をパッケージに置けば go build が自動で取り込みます。これがないと .exe には汎用アイコンが表示されますが、インストーラーが作るショートカットにはアップロードしたアイコンがそのまま使われます。
Rust
Windows 上では、デフォルトのターゲットで問題ありません。
cargo build --release
macOS や Linux からは GNU ツールチェインをターゲットにします。MinGW をインストールしておけばクロスコンパイルできます。
rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu
cargo-xwin は MSVC ターゲット向けにクロスコンパイルする代替手段です。
- GUI アプリでは、コンソールウィンドウを出さないように
main.rsの先頭に#![windows_subsystem = "windows"]を追加します。 - アイコンとバージョン情報を埋め込むには、
build.rsからwinresまたはembed-resourcecrate を使い、app.icoを参照する.rcファイルを用意します。 - バイナリを小さくするには、release プロファイルで
opt-level = "z"、lto = true、strip = trueを設定します。
アップロードするもの
単一の .exe: ExeTup にそのままアップロードします。zip は不要です。インストーラーが Program Files(またはユーザーごとの場所)への配置、ショートカット、アンインストーラーを用意します。
.exe とアセット(設定テンプレート、webview アプリ用の Web アセット、data/ フォルダーなど):プログラムが実行時に想定するフォルダー構成のまま zip にまとめてアップロードします。あるいは .exe をアップロードし、「その他のファイル」のステップで追加ファイルを加えることもできます。どちらの場合もプログラムと同じ場所に配置されます。
続いて名前、バージョン、発行者を入力し、インストール範囲とアーキテクチャを選び、.ico をアップロードしてビルドします。結果は Windows でテストしてください。Windows PC なしでテストする方法も参照してください。
コマンドラインツール
インストーラーはデスクトップアプリ向けに作られていますが、CLI にも利点があります。決まった配置場所、アンインストール項目、そして IT 部門向けに /S によるサイレント展開ができます。注意点が 2 つあります。
- インストーラーはフォルダーを
PATHに追加しません。ユーザーにインストールフォルダーを案内するか、初回起動時にツール自身が追加を提案するようにしてください。 - ユーザーごとのインストールは
%LOCALAPPDATA%\Programs\MyAppに配置され、管理者権限なしでアクセスできます。
開発者向けのツールであれば、インストーラーよりも winget や scoop のマニフェストのほうが利用者に合うかもしれません。これらは同じ署名済みの .exe を指すことができます。
補足
- ウイルス対策ソフトのヒューリスティック検出。 ビルドしたての、未署名で静的リンクされた Go や Rust のバイナリは、ヒューリスティックスキャナーに引っかかることがあります。プログラムを Program Files に配置するインストーラーは多少役立ちますが、コード署名の効果は大きいです。SmartScreen のガイドを参照してください。
- ランタイム不要、前提条件なし。 どちらの言語もランタイムをバイナリにリンクします。インストーラーはバイナリをそのまま配布します。
- 更新。 より高いバージョンの新しいインストーラーが、ファイルをその場で置き換えます。
よくある質問
.exe だけをアップロードできますか?
はい。単一の .exe だけでも受け付けられ、インストーラーはショートカット、アンインストーラー、Windows の設定への項目を提供します。
インストーラーを作るのに Windows は必要ですか?
いいえ。お使いの OS でバイナリをビルドしてアップロードすれば、ExeTup がクラウドでインストーラーをコンパイルします。Windows が必要なのは結果をテストするときだけです。
Go の GUI アプリで黒いコンソールウィンドウが開くのはなぜですか?
-ldflags "-H windowsgui" を付けてビルドしてください。Rust では main.rs に #![windows_subsystem = "windows"] を追加します。
.exe 自体に自分のアイコンを付けるには?
Windows リソースとして埋め込みます。Go では go-winres、Rust では winres または embed-resource crate を使います。インストーラーとショートカット用に、同じ .ico を ExeTup にアップロードしてください。
関連ガイド
- Mac や Linux で Windows インストーラーを作成するmacOS や Linux で開発しているときに Setup.exe を作る方法を解説します。NSIS のクロスコンパイルからブラウザーだけで完結するビルドまで、そして Windows PC を持たずに結果をテストする方法も紹介します。
- .exe を Windows インストーラーにする方法(exe から Setup.exe へ)単体の .exe や .exe を含むフォルダーを、インストーラースクリプトを書かずに、ショートカットとアンインストーラー付きの本格的な Windows インストーラーに変換する方法。
- Setup.exe のサイレントインストール:/S スイッチ、フォルダー指定、展開NSIS 製の Setup.exe を /S でサイレント実行し、/D= でインストール先を指定し、サイレントでアンインストールし、Intune、PDQ、スクリプトで展開する方法。