Instalador de Windows para apps en Go o Rust (desde cualquier SO)
Compila de forma cruzada un programa en Go o Rust para Windows, incrusta un icono, oculta la consola en apps gráficas y empaqueta el .exe único (con sus recursos) en un Setup.exe con accesos directos y desinstalador.
Actualizado el 31 de octubre de 2026 · 4 min de lectura
Tanto Go como Rust generan un único .exe estático para Windows desde un Mac o una máquina Linux, y eso explica buena parte de su atractivo para herramientas de escritorio. Aun así, los usuarios esperan instalar ese .exe, no dejarlo en la carpeta de Descargas. Esta guía repasa las opciones de compilación que importan y cómo convertir el binario en un Setup.exe sin tocar Windows hasta la hora de probar.
Go
Compila de forma cruzada indicando el destino en el entorno:
GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o MyApp.exe .
-s -welimina las tablas de símbolos y la información de depuración, lo que reduce el tamaño del binario.- Para una app gráfica (Fyne, Wails, Walk, un webview), añade
-H windowsguidentro de-ldflagspara que no se abra ninguna ventana de consola:-ldflags "-s -w -H windowsgui". - Usa
GOARCH=386para una compilación de 32 bits yarm64para Windows en ARM.
Icono e información de versión. Go no tiene una forma integrada de incrustar un icono de Windows. go-winres genera un archivo de recursos .syso a partir de una pequeña descripción JSON y tu .ico; coloca el .syso en el paquete y go build lo incluirá. Sin él, el .exe muestra el icono genérico, aunque los accesos directos del instalador seguirán usando el icono que subas.
Rust
En Windows, el destino predeterminado funciona:
cargo build --release
Desde macOS o Linux, apunta a la cadena de herramientas GNU, que compila de forma cruzada con MinGW instalado:
rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu
cargo-xwin es una alternativa que compila de forma cruzada para el destino MSVC.
- Para una app gráfica, añade
#![windows_subsystem = "windows"]al principio demain.rspara suprimir la ventana de consola. - Para incrustar un icono e información de versión, usa el crate
winresoembed-resourcedesdebuild.rscon un archivo.rcque haga referencia aapp.ico. - Define
opt-level = "z",lto = trueystrip = trueen el perfil de release para obtener un binario más pequeño.
Qué subir
Un único .exe: súbelo directamente a ExeTup; no hace falta ningún zip. El instalador le da un lugar en Program Files (o por usuario), accesos directos y un desinstalador.
Un .exe más recursos (una plantilla de configuración, recursos web para una app con webview, una carpeta data/): comprímelos juntos en un zip con la estructura de carpetas que el programa espera en tiempo de ejecución y sube el zip. Como alternativa, sube el .exe y añade los extras en el paso "Otros archivos"; en ambos casos acaban junto al programa.
Después introduce el nombre, la versión y el editor, elige el ámbito y la arquitectura, sube el .ico y compila. Prueba el resultado en Windows; consulta las opciones para probar sin un PC con Windows.
Herramientas de línea de comandos
Los instaladores están pensados para apps de escritorio, pero una CLI también sale ganando: una ubicación conocida, una entrada de desinstalación y despliegue silencioso con /S para los equipos de TI. Dos advertencias:
- El instalador no añade la carpeta al
PATH. Indica a los usuarios la carpeta de instalación o haz que la herramienta ofrezca añadirse ella misma en la primera ejecución. - Las instalaciones por usuario van a
%LOCALAPPDATA%\Programs\MyApp, a donde los usuarios pueden acceder sin permisos de administrador.
Para herramientas dirigidas a desarrolladores, los manifiestos de winget o scoop pueden encajar mejor con tu público que un instalador; pueden apuntar al mismo .exe firmado.
Notas
- Heurísticas de los antivirus. Los binarios recién compilados, sin firmar y enlazados estáticamente de Go y Rust a veces activan los analizadores heurísticos. Un instalador que coloque el programa en Program Files ayuda un poco; la firma de código ayuda mucho. Consulta la guía sobre SmartScreen.
- Sin runtime, sin requisitos previos. Ambos lenguajes enlazan su runtime dentro del binario. El instalador distribuye el binario tal cual.
- Actualizaciones. Un nuevo instalador con una versión superior reemplaza los archivos en su sitio.
Preguntas frecuentes
¿Puedo subir solo el .exe?
Sí. Un único .exe se acepta por sí solo, y el instalador sigue ofreciendo accesos directos, un desinstalador y la entrada en la Configuración de Windows.
¿Necesito Windows para crear el instalador?
No. Compila el binario en tu SO, súbelo y ExeTup compila el instalador en la nube. Windows solo hace falta para probar el resultado.
¿Por qué mi app gráfica en Go abre una ventana de consola negra?
Compila con -ldflags "-H windowsgui". En Rust, añade #![windows_subsystem = "windows"] a main.rs.
¿Cómo pongo mi icono en el propio .exe?
Incrústalo como recurso de Windows: go-winres para Go, el crate winres o embed-resource para Rust. Sube el mismo .ico en ExeTup para el instalador y los accesos directos.
Guías relacionadas
- Crear un instalador de Windows desde Mac o LinuxTus opciones para generar un Setup.exe cuando desarrollas en macOS o Linux, desde compilar NSIS de forma cruzada hasta una compilación solo en el navegador, y cómo probar el resultado sin tener un PC con Windows.
- Convertir un .exe en un instalador de Windows (exe a Setup.exe)Cómo convertir un .exe simple, o una carpeta que contiene un .exe, en un instalador de Windows real con accesos directos y desinstalador, sin escribir un script de instalación.
- Instalación silenciosa de un Setup.exe: /S, carpeta y despliegueCómo ejecutar un Setup.exe basado en NSIS en modo silencioso con /S, elegir la carpeta con /D=, desinstalar sin interfaz y desplegar el instalador con Intune, PDQ o un script.