本文へスキップ

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-resource crate を使い、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 にアップロードしてください。

関連ガイド