Chega de Atualizar Versão Manualmente nos Seus Apps .NET MAUI
"Script PowerShell gratuito para automatizar o versionamento .NET MAUI. Sincronize iOS e Android, incremente builds e publique mudanças direto do terminal."
Chega de Atualizar Versão Manualmente nos Seus Apps .NET MAUI
Se você mantém mais de um app .NET MAUI, provavelmente já viveu esse momento: acabou de corrigir um bug, abre o Info.plist para incrementar o build do iOS, depois abre o AndroidManifest.xml para fazer o mesmo no Android, aí percebe que o .csproj também precisa ser atualizado, e ainda começa a se perguntar se os outros três apps que você mantém estão sincronizados — e o git ainda nem foi tocado.
É tedioso. É suscetível a erros. E escala pessimamente.
Este post apresenta um script PowerShell gratuito e open-source que automatiza tudo isso.
O Problema do Versionamento Manual
Em um projeto .NET MAUI, a versão do seu app vive em três lugares diferentes:
Platforms/iOS/Info.plist
O arquivo que o Xcode e o App Store Connect leem durante o archive e a submissão.
CFBundleShortVersionString— a versão que seus usuários veem (5.48)CFBundleVersion— o build number que a Apple usa para distinguir uploads (607)
Platforms/Android/AndroidManifest.xml
O arquivo que as ferramentas de build Android e o Google Play leem a cada upload.
android:versionName— a versão que seus usuários veem (5.48)android:versionCode— um inteiro estritamente crescente que o Google Play exige (607)
*.csproj
Onde o pipeline MSBuild do .NET MAUI lê as informações de versão em tempo de build.
<ApplicationDisplayVersion>— string de versão<ApplicationVersion>— build number
Manter esses arquivos sincronizados em um projeto é gerenciável. Manter em sincronismo em quatro, seis ou dez apps — a cada release — é quando os erros começam a aparecer. Um build number esquecido causa rejeição na App Store. Uma versão incompatível confunde os testadores. Um commit apressado deixa o Android em 5.47 enquanto o iOS ainda está em 5.46.
Tem que existir uma forma melhor.
Apresentando o .NET MAUI Version Manager
O MAUI Version Manager é um único script PowerShell 7 que oferece uma interface de terminal limpa e colorida para gerenciar versões em todos os seus apps MAUI de uma vez.
╔══════════════════════════════════════════════════════════════════════╗
║ .NET MAUI · Version Manager ║
╚══════════════════════════════════════════════════════════════════════╝
v2.0 · K:\Projetos\MeusApps
# App Branch iOS Android Status
──────────────────────────────────────────────────────────────────────────
1 MeuApp - Core main 5.48 #607 5.48 #607
2 MeuApp - Pro main 5.43 #595 5.43 #595
3 MeuApp - Lite feature/login 5.43 #27 5.43 #595 ⚠ DESSYNC
4 MeuApp - Enterprise main 5.51 #601 5.51 #601
──────────────────────────────────────────────────────────────────────────
G Git Pull todos 0 Sair
› App (número) ou opção:
Você enxerga tudo de uma vez. Age com um único número digitado.
Funcionalidades em Destaque
- 🔍 Descoberta automática — coloque o script na pasta raiz e ele encontra todos os apps MAUI nas subpastas automaticamente, com profundidade de busca configurável
- 🎨 Interface colorida no terminal — nomes de apps, branches, versões e indicadores de status são codificados por cor para leitura instantânea
- 🔀 Branch git por app — cada linha mostra o branch atual para você sempre saber o estado de cada projeto
- ⚠️ Detecção de dessincronização — avisa automaticamente quando as versões iOS e Android estão diferentes
- ✎ Indicadores de git — veja alterações não commitadas e commits não enviados sem sair da ferramenta
- ⬆️ Incrementar versão + build — sobe a versão menor e o build number em um único passo nos três arquivos
- 🔢 Incrementar só o build — para releases de correção onde a string de versão fica igual
- ✏️ Entrada manual — digite qualquer versão e build que precisar
- 🔄 Sincronizar iOS ↔ Android — quando as plataformas divergem, escolha qual é a referência e o script alinha a outra
- 📦 Build iOS — chama
dotnet publishcontra um Mac remoto via SSH - 🚀 Git commit + push — após qualquer alteração de versão, um prompt cria um commit no formato conventional commits e faz push
Requisitos
- PowerShell 7+ (
pwsh) — baixe aqui - Git — deve estar no PATH
- .NET SDK — necessário apenas se usar a opção de build iOS
- Um Mac acessível via SSH — necessário apenas para builds iOS
Só isso. Sem npm, sem pacotes NuGet, sem arquivos de configuração para manter.
Quickstart: Funcionando em 60 Segundos
Passo 1 — Baixe o script
Coloque o maui-version.ps1 na pasta raiz que contém as subpastas dos seus apps MAUI.
MeusApps/
├── maui-version.ps1 ← script vai aqui
├── AppCore/
│ ├── Platforms/iOS/Info.plist
│ └── Platforms/Android/AndroidManifest.xml
├── AppPro/
│ ├── Platforms/iOS/Info.plist
│ └── Platforms/Android/AndroidManifest.xml
└── AppLite/
└── Platforms/Android/AndroidManifest.xml
Passo 2 — Execute
pwsh maui-version.ps1
Se seus apps estiverem em mais de um nível de subpastas, use -Depth:
pwsh maui-version.ps1 -Depth 3
Passo 3 — Escolha um app e aja
Digite o número do app, escolha uma ação, confirme e opcionalmente faça push. Pronto.
Tour pelos Menus
Tabela principal
A cada carregamento (e após cada ação), o script atualiza a tabela. Cada linha mostra:
| Coluna | O que indica |
|---|---|
# |
O número para digitar e selecionar o app |
App |
Nome da pasta — amarelo se iOS e Android estão dessincronizados |
Branch |
Branch git atual — verde para main/master, magenta para outros |
iOS |
String de versão e build number do Info.plist |
Android |
String de versão e build number do AndroidManifest.xml |
Status |
⚠ DESSYNC se as plataformas diferem, ✎ se há alterações, ↑N se está à frente do remote |
Menu de detalhe do app
Ao selecionar um app, você vê o painel de detalhe:
╭──────────────────────────────────────────────────────────────╮
│ MeuApp - Core │
│ Branch: main │
│ iOS v5.48 #607 │
│ Android v5.48 #607 │
╰──────────────────────────────────────────────────────────────╯
1 Incrementar Versão + Build 2 Incrementar só Build
3 Definir versão manualmente 4 Sincronizar iOS ↔ Android
5 Gerar Build iOS 6 Git Pull
0 Voltar
| Opção | Quando usar |
|---|---|
| 1 — Incrementar versão + build | Nova feature. 5.47 → 5.48, build 606 → 607 |
| 2 — Incrementar só build | Correção ou patch. Versão fica em 5.47, build 606 → 607 |
| 3 — Definir manualmente | Pular para uma versão específica, ex: 6.0.0 para um release major |
| 4 — Sincronizar plataformas | iOS divergiu do Android (ou vice-versa) — escolha a referência e alinhe |
| 5 — Build iOS | Aciona dotnet publish contra seu Mac de build |
| 6 — Git Pull | Faz pull do app específico |
Após as opções 1–4, o script exibe uma prévia antes/depois e pede confirmação antes de escrever qualquer arquivo:
Antes : v5.47 #606
Depois: v5.48 #607
Confirmar? (S/n):
Em seguida:
Deseja fazer Commit + Push? (s/N):
Se você confirmar, ele faz stage de tudo, cria um commit como chore(version): bump MeuApp to v5.48 build 607 e faz push.
O Que é Modificado — e Por Que Três Arquivos
Você pode se perguntar por que o script mexe em três arquivos. Aqui está o motivo de cada um:
Info.plist é lido pelo Xcode e pelo pipeline do App Store Connect. CFBundleShortVersionString é a versão visível ao usuário (5.48). CFBundleVersion é o build number que a Apple usa para distinguir uploads (607). Ambos precisam estar corretos ou seu archive será rejeitado.
AndroidManifest.xml é lido pelas ferramentas de build Android e pelo Google Play. android:versionName é a string visível ao usuário. android:versionCode deve ser um inteiro estritamente crescente — o Google Play rejeita qualquer upload onde o código não seja maior que o release anterior.
*.csproj é onde o pipeline MSBuild do .NET MAUI lê as informações de versão. <ApplicationDisplayVersion> e <ApplicationVersion> podem sobrescrever os arquivos de plataforma durante o build. Mantê-los sincronizados garante que qualquer pipeline de CI que lê a versão do arquivo de projeto concorde com o que os manifests de plataforma declaram.
Modificar os três em uma única operação elimina a causa mais comum de incompatibilidade de versão.
Cenários do Dia a Dia
Cenário 1: Você mantém um conjunto de apps relacionados
Você tem um app Core, um Pro e um Lite. Todos são lançados no mesmo ciclo. Hoje você quer levar os três para 5.49 com build 610.
Com este script: abra a ferramenta, selecione o app 1, escolha a opção 1, confirme, faça push. Repita para os apps 2 e 3. Tempo total: menos de um minuto.
Sem este script: abra cada projeto, edite três arquivos em cada um, faça commits separados, push separados. E torça para não ter esquecido nenhum.
Cenário 2: Hotfix só no Android
Um crash crítico no Android precisa de correção rápida. O iOS está bem. Você quer incrementar só o build number do Android sem tocar na versão do iOS.
Selecione o app, escolha a opção 2 (só build), confirme. O script sincroniza os três arquivos. Faça push.
Cenário 3: iOS e Android divergiram
Um desenvolvedor fez push de um build Android sem atualizar o iOS. A tabela mostra ⚠ DESSYNC. Selecione o app, escolha a opção 4, defina o Android como referência, confirme. As duas plataformas passam a concordar.
Cenário 4: Salto de versão major
Você está lançando a versão 6.0.0. Selecione o app, escolha a opção 3 (manual), digite 6.0.0 como versão e 700 como build. Confirme, faça push.
Perguntas Frequentes
Funciona com apps que só têm Android (sem Info.plist)?
Sim. O script lida com apps que têm arquivos de apenas uma plataforma. Ele lê e escreve o que existe e pula o que não está presente.
Funciona com apps só iOS (sem AndroidManifest.xml)?
Sim, a mesma lógica se aplica.
E se meu .csproj não tiver <ApplicationDisplayVersion>?
O script verifica se as tags existem antes de substituí-las. Se estiverem ausentes, pula o .csproj silenciosamente — não vai injetar novas tags.
Posso usar em CI?
O script é interativo por design. Para CI, você chamaria as funções individuais (Set-IosVersion, Set-AndroidVersion, Set-CsprojVersion) diretamente após dot-sourcing o arquivo. Um modo não-interativo pode ser adicionado em uma versão futura.
Suporta monorepos onde os apps ficam a mais de um nível de profundidade?
Sim. Use o parâmetro -Depth. -Depth 3 busca três níveis de profundidade, por exemplo.
Ele pode modificar acidentalmente apps que não deveria? Ele só modifica o app que você selecionou e confirmou explicitamente. A tabela é somente leitura até que você tome uma ação.
Obtenha o Script
O script é gratuito e está disponível como GitHub Gist:
👉 github.com/wagenheimer/6e27938c32dd667e2d8bf2e135dad2f1
O Gist contém:
maui-version.ps1— o scriptREADME.md— documentação em inglêsREADME.pt-BR.md— documentação em português
Encontrou um bug ou quer sugerir uma funcionalidade? Deixe um comentário no Gist — feedback é bem-vindo.
Conclusão
Gerenciamento de versão no .NET MAUI é uma fonte pequena, mas persistente, de atrito. Três arquivos, duas plataformas, N apps — vai acumulando. O MAUI Version Manager comprime esse atrito em uma única sessão interativa: você vê todos os seus apps, escolhe um, age, faz push.
Não precisa de instalação além do PowerShell 7. Modifica apenas o que você confirma. E é gratuito.
Se você mantém mais de um app MAUI, experimente. Na primeira vez que ele te salvar de uma rejeição na App Store, você não vai mais querer voltar atrás.
Achou útil? Compartilhe com seu time ou com qualquer pessoa desenvolvendo apps .NET MAUI.
