- El desarrollo nativo en Windows es complejo e ineficiente debido a la dependencia de instalar Visual Studio
- Decenas de GB de instalación, gestión opaca de componentes y problemas de incompatibilidad de versiones reducen la productividad de los desarrolladores
- Para resolverlo, se desarrolló la herramienta CLI ligera
msvcup, que permite instalar automáticamente el toolchain de MSVC y el Windows SDK por versión y de forma aislada
msvcup ofrece un entorno de compilación reproducible mediante análisis de manifiestos JSON, configuración automática del entorno (autoenv) y soporte para archivos de bloqueo
- Este enfoque permite un sistema de compilación totalmente automatizado y basado en scripts sin depender de Visual Studio Installer
Problemas del desarrollo nativo en Windows
- El método tradicional, que exige instalar Visual Studio, representa una carga para los desarrolladores debido a un proceso de instalación complejo y una gestión inestable de dependencias
- Hay que elegir detalles como la carga de trabajo “Desktop development with C++” y versiones específicas del SDK; si se selecciona algo incorrectamente, la compilación falla
- La instalación puede ocupar hasta 50 GB y, aun después de desinstalar, quedan entradas residuales en el registro y servicios en segundo plano
- En Linux, el toolchain puede instalarse con una sola línea en el gestor de paquetes, pero en Windows hay que seleccionar manualmente miles de componentes
- Visual Studio tiene una estructura monolítica donde editor, compilador y SDK están entrelazados, lo que dificulta gestionar versiones y reproducir entornos
- Como resultado, son frecuentes las inconsistencias del tipo “en mi PC sí funciona”, lo que se convierte en una barrera de entrada para el desarrollo nativo
msvcup: un nuevo enfoque
- msvcup es una herramienta CLI de código abierto que descarga e instala directamente el toolchain de MSVC y el Windows SDK sin necesidad de instalar Visual Studio
- Cada versión se instala en un directorio aislado dentro de
C:\msvcup\, por lo que es posible usar varias versiones en paralelo sin conflictos
- La instalación se completa en pocos minutos e incluye automáticamente herramientas de compilación cruzada para ARM
- El comando
msvcup install instala los paquetes necesarios, y el comando autoenv crea un directorio de entorno automático
- Ese directorio incluye ejecutables wrapper que configuran automáticamente las variables de entorno y un archivo
toolchain.cmake, por lo que los proyectos con CMake pueden compilarse sin configuración adicional
- En el ejemplo del script
build.bat, es posible compilar un programa “Hello, World” sin Visual Studio usando msvcup
- Funciona en entornos con Windows 10 o superior con solo
curl y tar
Cómo funciona internamente
- Analiza los manifiestos JSON de componentes de Visual Studio distribuidos por Microsoft para identificar solo los paquetes necesarios
- Descarga directamente desde el CDN de Microsoft solo los elementos esenciales: compilador, linker, headers, bibliotecas, etc.
- Los componentes instalados se gestionan con un archivo de bloqueo (
lock file), lo que permite que todo el equipo comparta exactamente las mismas versiones de paquetes
- Los comandos
install y autoenv son idempotentes, y si todo ya está instalado terminan en apenas unos milisegundos
Casos reales de uso
- Tuple (app de programación en pareja) integró
msvcup en su sistema de compilación CI, eliminando el requisito de tener Visual Studio preinstalado
- Esto permite compilar cientos de proyectos en C/C++, incluido WebRTC, con el mismo toolchain/SDK
- Soporta tanto compilaciones x86_64 como ARM
- Ventajas
- La instalación en directorios por versión permite gestionar varias versiones en paralelo y reinstalar fácilmente
- Soporte automático para compilación cruzada, sin configuración extra
- Reproducibilidad garantizada basada en archivos de bloqueo, con detección inmediata si Microsoft cambia algo
- Ejecución rápida, sin reinstalaciones innecesarias
Limitaciones y expansión
msvcup está diseñado con foco en el toolchain de compilación, por lo que si se necesita el IDE de Visual Studio como tal, la instalación oficial sigue siendo necesaria
- Sin embargo, en la mayoría de los flujos de trabajo de desarrollo nativo, ofrece un entorno de compilación completo incluso sin IDE
- El script de compilación de raylib presentado como ejemplo instala automáticamente el SDK y el toolchain, y compila el proyecto sin Visual Studio
- Realiza un proceso de compilación totalmente automatizado solo desde la línea de comandos, sin GUI
Conclusión
msvcup elimina la complejidad de Visual Studio Installer y ofrece un entorno ligero de compilación nativa con control de versiones
- Este enfoque transforma el desarrollo nativo en Windows en un proceso reproducible y automatizado, y ayuda a los desarrolladores a liberarse de la dependencia del IDE
- Repo : https://github.com/marler8997/msvcup
5 comentarios
Comentarios de Hacker News
Esto se ve más complicado que lo que yo hago
simplemente instalas LTSC Visual Studio Build Tools, y pones un comando como
cl yourprogram.c /link user32.lib advapi32.lib ...en un archivo cmdyo edito con vim y he compilado varias utilidades así
el toolchain de Visual Studio tiene LTSC y versiones estables, pero la mayoría no lo sabe
en un entorno colaborativo, conviene usar una versión fija de la documentación oficial del historial de lanzamientos
como en los viejos tiempos, cuando toda la empresa fijaba la misma versión del toolchain
por eso muchos estudiantes o desarrolladores hobby no lo conocen
en cambio, la mayoría de la gente que usa VS en una empresa sí lo sabe
¿alguien sabe cuándo saldrá?
El toolchain de Linux tampoco está libre del infierno de dependencias
instalas un paquete de npm y de repente necesitas cmake, o aparece un conflicto de versión de glibc, o un proyecto de C++ exige la versión más reciente de boost...
todavía recuerdo cuando tocó parchear openSSL por heartbleed
Visual Studio también es incómodo, pero el verdadero infierno es la confusión de versiones de .NET Framework
la versión de .NET instalada cambia según la versión de Windows, y tampoco está claro en qué runtime va a ejecutarse una app
por eso, en despliegues grandes, hay que hacer un shim para verificar la versión de .NET en C++ y así ejecutar con el runtime correcto
el equipo de glibc es muy estricto con la compatibilidad hacia atrás y hacia adelante
en este artículo de LWN se puede ver cuándo fue la última vez que rompieron compatibilidad
el problema es que la gente fija mal la versión (pinning) de glibc
glibc no se debe fijar a una versión
GCC sí ha roto compatibilidad algunas veces, pero casi siempre por cambios en el estándar de C++
.NET Framework ya es legacy, y desde .NET 5 estos problemas ya no existen
aunque todavía hay muchas apps que dependen de versiones viejas
resolvieron el problema, pero al mismo tiempo crearon nueva complejidad
a veces dan ganas de volver a la época del gestor de paquetes del sistema
en entornos embebidos, rust + probe-rs se siente mucho más cómodo
El instalador de Visual Studio permite instalación desatendida con parámetros de línea de comandos
está explicado en la documentación oficial
en 2018, cuando trabajaba en una red satelital con internet lento, usé ese método porque tenía que crear un paquete de instalación offline
Viendo el script, aparece algo como
curl -L -o msvcup.zip https://github.com/marler8997/msvcup/releases/...así
pero me incomoda instalar un ejecutable de una cuenta desconocida de GitHub sin verificar ni siquiera el hash
la situación en Windows no es tan mala como dice el blog, pero esto parece más otro script de instalación riesgoso que una solución
simplemente puedes leer y revisar el script tú mismo
al final, el método curl|sh solo descarga código fuente; no es más riesgoso que instalar directamente un ejecutable
su proyecto zigwin32 incluso está enlazado desde win32metadata de Microsoft
o sea, es alguien confiable
Este texto se siente como si lo hubiera escrito una IA
estructuras como “it’s not just X, but Y” o las listas con énfasis son muy típicas del estilo de un LLM
me da curiosidad saber cuánto del proyecto fue realmente hecho por una persona
la estructura de las listas era rara y poco consistente
pero si lo escribió un LLM, podría ser prueba de que la calidad de los LLM ya subió bastante
también podría ser por herramientas como Grammarly
porque a los lectores les resulta más fácil de leer
la verdad, estaría bien que solo dijeran con honestidad si usaron IA o no
Como intento de mejorar el DX de Visual Studio, msvcup se siente realmente fresco
ojalá hubiera existido algo así cuando estaba en la universidad
como alternativa, también está la opción de instalar Build Tools en un contenedor
Simplemente se puede instalar con winget
winget install --id Microsoft.VisualStudio.2022.BuildToolssi necesitas funciones de WinRT, puedes agregar
winget install --id Microsoft.WindowsSDK.10.0.18362winget install --id Microsoft.WindowsAppRuntime.1.8también hay que especificar qué workload se va a instalar, y si no conoces el proyecto, toca prueba y error
.vsconfigayuda un poco, pero no es perfectoOjalá los proyectos open source no bloquearan el soporte para MinGW
es un buen compilador que funciona bien incluso sin DLL adicionales
no entiendo por qué el open source tendría que imponer un compilador privativo
WIL es una biblioteca muy usada por desarrolladores del kernel, y mejora bastante la seguridad y la comodidad del código
por ejemplo, el SDK de Steamworks compila con MinGW, pero se cae en runtime
me decepciona que ni siquiera lo mencionen en esta entrada del blog
la combinación de Clang + MSVC STL + WinSDK es mucho más limpia
O también se puede hacer así de simple
"winget install Microsoft.VisualStudio.BuildTools""winget install Microsoft.WindowsSDK.10.0.26100"lo prefiero porque tiene buena estabilidad en relación con el esfuerzo
ojalá todos los lenguajes tuvieran una herramienta de aislamiento de versiones como Python uv
cosas como Bing, Copilot o la publicidad sí merecen críticas, pero casi todo se puede desactivar
A mí también me pasó un problema de dependencia con
glibccuando compilé en Ubuntu 24.04 y luego intenté ejecutarlo en CentOS 6 o 7.Parece que el problema es que, por defecto, toma la versión de
glibcdel entorno de compilación.No queda otra que depender de
glibc..A diferencia de lenguajes de script como python/jv/.net/js, es inevitable depender de
glibc.Esa es también la razón por la que se distribuyen bibliotecas para cada distribución.
Si se compiló al menos con una
glibc, entonces, si no tiene dependencias especiales, puede ejecutarse sin problema en otras distribuciones con versiones superiores.Con WSL2 y Ubuntu, Windows sí se volvió mucho mejor para desarrollar. Pero si tu entorno es Visual Studio y no VS Code, esto parece que al menos podría ayudar un poco. Aunque bueno, parece que no se puede hacer en Windows con gestores de paquetes como
chocoowinget.Parece que los gestores de paquetes sí tienden a enfocarse más en el resultado final que en el SDK
Cosas como
vcredistla mayoría de los desarrolladores suelen configurarlas para que se instalen dentro del script del gestor de paquetesPero el entorno de compilación sí es una historia un poco distinta