Pular para o conteúdo

Instalador do Windows para apps em Go ou Rust (de qualquer SO)

Faça a compilação cruzada de um programa em Go ou Rust para Windows, incorpore um ícone, oculte o console em apps gráficos e empacote o .exe único (com seus recursos) em um Setup.exe com atalhos e desinstalador.

Atualizado em 31 de outubro de 2026 · 4 min de leitura

Go e Rust geram um único .exe estático para Windows a partir de um Mac ou de uma máquina Linux, e isso é boa parte do apelo das duas linguagens para ferramentas desktop. Ainda assim, os usuários esperam instalar esse .exe em vez de deixá-lo na pasta Downloads. Este guia cobre as flags de build que importam e como transformar o binário em um Setup.exe sem encostar no Windows até a hora de testar.

Go

Faça a compilação cruzada definindo o destino no ambiente:

GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o MyApp.exe .
  • -s -w remove as tabelas de símbolos e as informações de depuração, reduzindo o binário.
  • Para um app gráfico (Fyne, Wails, Walk, um webview), adicione -H windowsgui dentro de -ldflags para que nenhuma janela de console seja aberta: -ldflags "-s -w -H windowsgui".
  • Use GOARCH=386 para um build de 32 bits e arm64 para Windows em ARM.

Ícone e informações de versão. Go não tem um jeito nativo de incorporar um ícone do Windows. O go-winres gera um arquivo de recursos .syso a partir de uma pequena descrição JSON e do seu .ico; coloque o .syso no pacote e o go build o inclui automaticamente. Sem ele, o .exe mostra o ícone genérico, mas os atalhos do instalador ainda usarão o ícone que você enviar.

Rust

No Windows, o destino padrão funciona:

cargo build --release

A partir do macOS ou do Linux, use o toolchain GNU como destino, que faz a compilação cruzada com o MinGW instalado:

rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu

O cargo-xwin é uma alternativa que faz a compilação cruzada para o destino MSVC.

  • Para um app gráfico, adicione #![windows_subsystem = "windows"] no topo do main.rs para suprimir a janela de console.
  • Para incorporar um ícone e informações de versão, use o crate winres ou embed-resource a partir do build.rs com um arquivo .rc que referencie app.ico.
  • Defina opt-level = "z", lto = true e strip = true no perfil de release para obter um binário menor.

O que enviar

Um único .exe: envie-o diretamente ao ExeTup; não precisa de zip. O instalador dá a ele um lugar em Program Files (ou por usuário), atalhos e um desinstalador.

Um .exe mais recursos (um modelo de configuração, recursos web para um app com webview, uma pasta data/): compacte tudo em um zip com a estrutura de pastas que o programa espera em tempo de execução e envie o zip. Como alternativa, envie o .exe e adicione os extras na etapa "Outros arquivos"; nos dois casos eles ficam ao lado do programa.

Em seguida, informe o nome, a versão e o editor, escolha o escopo e a arquitetura, envie o .ico e gere o build. Teste o resultado no Windows; veja as opções para testar sem um PC com Windows.

Ferramentas de linha de comando

Os instaladores são feitos para apps desktop, mas uma CLI também se beneficia: um local conhecido, uma entrada de desinstalação e implantação silenciosa com /S para equipes de TI. Duas ressalvas:

  • O instalador não adiciona a pasta ao PATH. Informe aos usuários a pasta de instalação ou faça a ferramenta oferecer adicionar a si mesma na primeira execução.
  • Instalações por usuário vão para %LOCALAPPDATA%\Programs\MyApp, que os usuários podem acessar sem direitos de administrador.

Para ferramentas voltadas a desenvolvedores, manifestos do winget ou do scoop podem servir melhor ao seu público do que um instalador; eles podem apontar para o mesmo .exe assinado.

Observações

  • Heurísticas de antivírus. Binários recém-compilados, não assinados e com vinculação estática de Go e Rust às vezes disparam os scanners heurísticos. Um instalador que coloque o programa em Program Files ajuda um pouco; a assinatura de código ajuda muito. Veja o guia sobre o SmartScreen.
  • Sem runtime, sem pré-requisitos. As duas linguagens incluem o runtime no binário. O instalador distribui o binário como está.
  • Atualizações. Um novo instalador com uma versão maior substitui os arquivos no lugar.

Perguntas frequentes

Posso enviar só o .exe?

Sim. Um único .exe é aceito sozinho, e o instalador ainda fornece atalhos, um desinstalador e a entrada nas Configurações do Windows.

Preciso do Windows para criar o instalador?

Não. Compile o binário no seu SO, envie-o e o ExeTup compila o instalador na nuvem. O Windows só é necessário para testar o resultado.

Por que meu app gráfico em Go abre uma janela de console preta?

Compile com -ldflags "-H windowsgui". Em Rust, adicione #![windows_subsystem = "windows"] ao main.rs.

Como coloco meu ícone no próprio .exe?

Incorpore-o como um recurso do Windows: go-winres para Go, o crate winres ou embed-resource para Rust. Envie o mesmo .ico no ExeTup para o instalador e os atalhos.

Guias relacionados