- O desenvolvimento nativo no Windows é complexo e ineficiente por causa da dependência da instalação do Visual Studio
- Dezenas de GB de instalação, gerenciamento opaco de componentes e problemas de incompatibilidade de versões reduzem a produtividade dos desenvolvedores
- Para resolver isso, foi criada a ferramenta CLI leve
msvcup, capaz de instalar automaticamente o toolchain MSVC e o Windows SDK de forma isolada por versão
- O
msvcup oferece ambientes de build reproduzíveis por meio de parsing de manifestos JSON, configuração automática de ambiente (autoenv) e suporte a lock file
- Essa abordagem elimina a dependência do Visual Studio Installer e viabiliza um sistema de build totalmente automatizado baseado em scripts
Problemas do desenvolvimento nativo no Windows
- O método tradicional, que exige instalar o Visual Studio, sobrecarrega os desenvolvedores com um processo de instalação complexo e gerenciamento instável de dependências
- É preciso selecionar detalhes como a workload “Desktop development with C++” e versões específicas do SDK, e escolhas incorretas podem causar falhas de build
- A instalação pode chegar a 50 GB e, mesmo após a remoção, entradas residuais no registro e serviços em segundo plano permanecem
- No Linux, é possível instalar um toolchain com uma única linha no gerenciador de pacotes, mas no Windows é preciso selecionar manualmente milhares de componentes
- O Visual Studio adota uma estrutura monolítica que mistura editor, compilador e SDK, o que dificulta o controle de versões e a reprodução do ambiente
- Como resultado, divergências do tipo “na minha máquina funciona” são frequentes, aumentando a barreira de entrada para o desenvolvimento nativo
msvcup: uma nova abordagem
- msvcup é uma ferramenta CLI open source que baixa e instala diretamente o toolchain MSVC e o Windows SDK sem precisar instalar o Visual Studio
- Cada versão é instalada em um diretório isolado dentro de
C:\msvcup\, permitindo uso paralelo sem conflitos entre versões
- A instalação é concluída em poucos minutos, e as ferramentas de cross-compilation para ARM também são incluídas automaticamente
- O comando
msvcup install instala os pacotes necessários, e o comando autoenv gera um diretório de ambiente automático
- Esse diretório inclui executáveis wrapper que configuram automaticamente as variáveis de ambiente e um arquivo
toolchain.cmake, permitindo compilar projetos CMake sem configuração adicional
- No exemplo de script
build.bat, é possível compilar um programa “Hello, World” sem Visual Studio usando o msvcup
- Funciona no Windows 10 ou superior com apenas
curl e tar instalados
Como funciona internamente
- O
msvcup faz parsing dos manifestos JSON de componentes do Visual Studio distribuídos pela Microsoft para identificar apenas os pacotes necessários
- Elementos essenciais como compilador, linker, headers e bibliotecas são baixados diretamente da CDN da Microsoft
- Os componentes instalados são gerenciados por meio de lock files, permitindo que toda a equipe compartilhe exatamente as mesmas versões de pacotes
- Os comandos
install e autoenv têm idempotência, concluindo em poucos milissegundos quando tudo já está instalado
Casos reais de uso
- A Tuple (app de pair programming) integrou o
msvcup ao seu sistema de build em CI, eliminando a necessidade de pré-instalar o Visual Studio
- Isso permite compilar centenas de projetos C/C++, incluindo o WebRTC, com o mesmo toolchain/SDK
- Há suporte tanto para builds x86_64 quanto ARM
- Vantagens
- A instalação em diretórios por versão permite gerenciar várias versões em paralelo e reinstalar com facilidade
- Suporte automático a cross-compilation, sem configuração extra
- Reprodutibilidade garantida com base em lock files, com detecção imediata de mudanças feitas pela Microsoft
- Execução rápida, sem reinstalações desnecessárias
Limitações e expansão
- O
msvcup foi projetado com foco no toolchain de compilação, então, quando o próprio IDE do Visual Studio é necessário, a instalação oficial ainda é exigida
- Ainda assim, na maioria dos fluxos de trabalho de desenvolvimento nativo, ele oferece um ambiente de build completo mesmo sem IDE
- O script de build do raylib apresentado como exemplo instala automaticamente o SDK e o toolchain e compila o projeto sem Visual Studio
- Um processo de build totalmente automatizado é executado apenas pela linha de comando, sem GUI
Conclusão
- O
msvcup remove a complexidade do Visual Studio Installer e oferece um ambiente leve de build nativo com controle de versões
- Essa abordagem transforma o desenvolvimento nativo no Windows em algo reproduzível e automatizado, ajudando os desenvolvedores a se libertarem da dependência do IDE
- Repo : https://github.com/marler8997/msvcup
5 comentários
Comentários do Hacker News
Isso parece mais complicado do que o que eu faço
basta instalar o LTSC Visual Studio Build Tools e colocar um comando como
cl yourprogram.c /link user32.lib advapi32.lib ...em um arquivo cmdeu editava no vim e venho compilando vários utilitários assim
o toolchain do Visual Studio tem LTSC e versões estáveis, mas a maioria das pessoas não sabe disso
em um ambiente colaborativo, é melhor usar uma versão fixa da documentação oficial de histórico de lançamentos
como na época em que a empresa inteira fixava e usava a mesma versão do toolchain
por isso estudantes e desenvolvedores por hobby muitas vezes não sabem disso
por outro lado, quem usa VS em empresas geralmente sabe
alguém sabe quando vai sair?
O toolchain do Linux também não está livre do inferno das dependências
você instala um pacote npm e de repente precisa de cmake, ou surge conflito de versão do glibc, ou é um projeto em C++ que exige uma versão mais nova do boost...
também ainda lembro de aplicar patch no openSSL na época do heartbleed
o Visual Studio também é incômodo, mas o verdadeiro inferno é a confusão de versões do .NET Framework
cada versão do Windows vem com uma versão diferente do .NET instalada, e não fica claro em qual runtime o app vai rodar
por isso, em distribuições em larga escala, é preciso criar em C++ um shim para verificar a versão do .NET e garantir a execução no runtime correto
a equipe do glibc é muito rígida com compatibilidade retroativa e progressiva
este artigo da LWN mostra a última vez em que a compatibilidade foi quebrada
o problema é quando as pessoas fazem pinning errado da versão do glibc
não se deve fixar a versão do glibc
o GCC já quebrou compatibilidade algumas vezes, mas na maioria dos casos foi por mudanças no padrão C++
o .NET Framework já é legado, e depois do .NET 5 esse problema não existe
só que ainda há muitos apps que dependem de versões antigas
eles resolveram o problema, mas ao mesmo tempo criaram nova complexidade
às vezes dá vontade de voltar para a era em que bastava o gerenciador de pacotes do sistema
em ambientes embarcados, rust + probe-rs é muito mais agradável
O instalador do Visual Studio permite instalação sem interação via parâmetros de linha de comando
isso é explicado na documentação oficial
em 2018, quando eu trabalhava em uma conexão via satélite com internet lenta, usei esse método porque precisava criar um pacote de instalação offline
Olhando o script, tem algo como
curl -L -o msvcup.zip https://github.com/marler8997/msvcup/releases/...desse jeito
mas eu fico desconfortável em instalar um executável de uma conta desconhecida do GitHub sem nem verificar o hash
a situação do Windows não é tão ruim quanto o blog diz, mas isso parece mais outro script de instalação arriscado do que uma solução
basta ler e revisar o script você mesmo
no fim, a abordagem curl|sh também só baixa código-fonte, então não é mais perigosa do que instalar um executável diretamente
o projeto dele, zigwin32, também é linkado pelo win32metadata da Microsoft
ou seja, é alguém confiável
Esse texto parece ter sido escrito por IA
estruturas como “it’s not just X, but Y” e listas com ênfase são um estilo típico de LLM
fico curioso sobre quanto do projeto foi realmente feito por humanos
a estrutura das listas era estranha e faltava consistência
mas, se foi um LLM que escreveu, isso também pode ser prova de que a qualidade dos LLMs hoje subiu bastante
talvez seja influência de ferramentas como Grammarly
porque ele é mais fácil de ler para o público
sinceramente, eu só queria que a pessoa deixasse claro se usou IA ou não
Como tentativa de melhorar a DX do Visual Studio, o msvcup é realmente algo novo e refrescante
eu gostaria que existisse algo assim na época da faculdade
como alternativa, também existe a abordagem de instalar o Build Tools em um contêiner
Dá para instalar simplesmente com winget
winget install --id Microsoft.VisualStudio.2022.BuildToolsse você precisar de recursos do WinRT, também pode adicionar
winget install --id Microsoft.WindowsSDK.10.0.18362winget install --id Microsoft.WindowsAppRuntime.1.8você também precisa especificar quais workloads instalar, e sem conhecer o projeto acaba virando tentativa e erro
o
.vsconfigaté ajuda um pouco, mas não resolve tudoEu gostaria que os projetos open source não bloqueassem o suporte ao MinGW
é um bom compilador que funciona muito bem mesmo sem DLLs extras
não entendo por que o open source insistiria em forçar um compilador proprietário
a WIL é uma biblioteca muito usada por desenvolvedores de kernel e melhora bastante a segurança e a praticidade do código
por exemplo, o Steamworks SDK compila com MinGW, mas trava em runtime
é uma pena que nem tenha sido mencionado neste post do blog
a combinação Clang + MSVC STL + WinSDK é muito mais limpa
Ou dá para fazer de forma simples assim
"winget install Microsoft.VisualStudio.BuildTools""winget install Microsoft.WindowsSDK.10.0.26100"gosto porque a estabilidade em relação ao esforço é boa
seria bom se todas as linguagens tivessem uma ferramenta de isolamento de versões como o Python uv
Bing, Copilot, anúncios e afins merecem críticas, mas em sua maioria podem ser desativados
Eu também tive um problema de dependência do glibc ao compilar no Ubuntu 24.04 e tentar executar no CentOS 6 ou 7.
Parece que o problema é que, por padrão, ele usa a versão do glibc do ambiente de build.
Não tem como não depender de
glibc..Ao contrário de linguagens de script como python/jv/.net/js, a dependência de
glibcé inevitável.Esse também é um dos motivos para distribuir bibliotecas para cada distribuição.
No mínimo, algo compilado com
glibc, se não tiver dependências especiais, pode rodar tranquilamente em outras distribuições de versão superior.Com o WSL2 e o Ubuntu, o Windows realmente ficou bem melhor para desenvolver também. Mas, se o ambiente for o Visual Studio em vez do VS Code, isso parece poder ajudar pelo menos um pouco. Só que, pelo visto, não dá para fazer isso no Windows com gerenciadores de pacotes como
chocoouwinget.Parece mesmo que os gerenciadores de pacotes focam mais no resultado final do que no SDK.
Coisas como o
vcredist, a maioria dos desenvolvedores costuma configurar para instalar dentro do script do gerenciador de pacotes.Mas o ambiente de build é um pouco diferente.