CW
Navegação
🇧🇷 PT 🇺🇸 EN
Home Sobre Stack Empresas Blog
CONTATO
Voltar para o Blog
28 abr. 2026 21 Visualizações
Chega de Atualizar Versão Manualmente nos Seus Apps .NET MAUI

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 publish contra 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

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.475.48, build 606607
2 — Incrementar só build Correção ou patch. Versão fica em 5.47, build 606607
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 script
  • README.md — documentação em inglês
  • README.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.

Cezar Wagenheimer
Written By

Cezar Wagenheimer

Full Stack Developer & Game Creator. Specialized in building immersive digital experiences and advanced systems.

Connect:
Share this article

Comentários

Seja o primeiro a comentar!

Deixe seu comentário