Перейти к содержимому

Установщик Windows для приложения на Go или Rust (сборка из любой ОС)

Кросс-компилируйте программу на Go или Rust под Windows, встройте иконку, скройте консоль для GUI-приложений и упакуйте единственный .exe (вместе с ресурсами) в Setup.exe с ярлыками и деинсталлятором.

Обновлено 31 октября 2026 г. · 3 мин чтения

Go и Rust собирают единственный статический .exe для Windows прямо на Mac или Linux-машине, и во многом именно этим они привлекательны для настольных утилит. Но пользователи всё равно ожидают, что этот .exe можно установить, а не держать в папке «Загрузки». В этом руководстве разобраны важные флаги сборки и то, как превратить бинарник в Setup.exe, не прикасаясь к Windows до самого тестирования.

Go

Кросс-компилируйте, задав целевую платформу через переменные окружения:

GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o MyApp.exe .
  • -s -w удаляет таблицы символов и отладочную информацию, уменьшая размер бинарника.
  • Для GUI-приложения (Fyne, Wails, Walk, webview) добавьте -H windowsgui внутрь -ldflags, чтобы не открывалось окно консоли: -ldflags "-s -w -H windowsgui".
  • Укажите GOARCH=386 для 32-битной сборки и arm64 для Windows на ARM.

Иконка и информация о версии. В Go нет встроенного способа добавить иконку Windows. go-winres генерирует файл ресурсов .syso из небольшого JSON-описания и вашего .ico; положите .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-приложения добавьте #![windows_subsystem = "windows"] в начало main.rs, чтобы скрыть окно консоли.
  • Чтобы встроить иконку и информацию о версии, используйте crate winres или embed-resource из build.rs с файлом .rc, ссылающимся на app.ico.
  • Задайте opt-level = "z", lto = true и strip = true в release-профиле, чтобы уменьшить бинарник.

Что загружать

Единственный .exe: загрузите его в ExeTup напрямую; zip не нужен. Установщик выделит ему место в Program Files (или в пользовательском каталоге), создаст ярлыки и деинсталлятор.

.exe плюс ресурсы (шаблон конфигурации, веб-ресурсы для webview-приложения, папка data/): упакуйте их в zip с той структурой папок, которую программа ожидает во время работы, и загрузите zip. Либо загрузите .exe и добавьте остальное на шаге «Другие файлы»; в обоих случаях файлы окажутся рядом с программой.

Затем укажите название, версию и издателя, выберите область установки и архитектуру, загрузите .ico и запустите сборку. Протестируйте результат на Windows; см. варианты тестирования без ПК с Windows.

Утилиты командной строки

Установщики создаются для настольных приложений, но и CLI от них выигрывает: известное расположение, запись для удаления и тихое развёртывание с /S для ИТ-отделов. Два нюанса:

  • Установщик не добавляет папку в PATH. Сообщите пользователям папку установки или научите утилиту предлагать добавить себя при первом запуске.
  • Пользовательские установки попадают в %LOCALAPPDATA%\Programs\MyApp, куда пользователи могут попасть без прав администратора.

Для инструментов, ориентированных на разработчиков, манифесты winget или scoop могут подойти вашей аудитории лучше установщика; они могут указывать на тот же подписанный .exe.

Примечания

  • Эвристика антивирусов. Свежие, неподписанные, статически слинкованные бинарники Go и Rust иногда срабатывают на эвристических сканерах. Установщик, помещающий программу в Program Files, немного помогает; подпись кода помогает значительно. См. руководство по SmartScreen.
  • Без рантайма и без зависимостей. Оба языка включают рантайм в бинарник. Установщик поставляет бинарник как есть.
  • Обновления. Новый установщик с более высокой версией заменяет файлы на месте.

Частые вопросы

Можно ли загрузить только .exe?

Да. Единственный .exe принимается сам по себе, и установщик всё равно создаёт ярлыки, деинсталлятор и запись в «Параметрах» Windows.

Нужна ли Windows, чтобы собрать установщик?

Нет. Соберите бинарник в своей ОС, загрузите его, и ExeTup скомпилирует установщик в облаке. Windows понадобится только для проверки результата.

Почему моё GUI-приложение на Go открывает чёрное окно консоли?

Соберите с -ldflags "-H windowsgui". В Rust добавьте #![windows_subsystem = "windows"] в main.rs.

Как поместить свою иконку на сам .exe?

Встройте её как ресурс Windows: go-winres для Go, crate winres или embed-resource для Rust. Загрузите тот же .ico в ExeTup для установщика и ярлыков.

Похожие руководства