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 -wremove 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 windowsguidentro de-ldflagspara que nenhuma janela de console seja aberta:-ldflags "-s -w -H windowsgui". - Use
GOARCH=386para um build de 32 bits earm64para 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 domain.rspara suprimir a janela de console. - Para incorporar um ícone e informações de versão, use o crate
winresouembed-resourcea partir dobuild.rscom um arquivo.rcque referencieapp.ico. - Defina
opt-level = "z",lto = trueestrip = trueno 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
- Criar um instalador do Windows no Mac ou no LinuxSuas opções para gerar um Setup.exe quando você desenvolve no macOS ou no Linux, da compilação cruzada com NSIS a um build feito só no navegador, e como testar o resultado sem ter um PC com Windows.
- Transformar um .exe em instalador do Windows (exe para Setup.exe)Como converter um .exe simples, ou uma pasta com um .exe dentro, em um instalador do Windows de verdade, com atalhos e desinstalador, sem escrever script de instalação.
- Instalação silenciosa de um Setup.exe: /S, pasta e implantaçãoComo executar um Setup.exe baseado em NSIS em modo silencioso com /S, escolher a pasta com /D=, desinstalar sem interface e implantar o instalador com Intune, PDQ ou um script.