Atualizar dependências de um workspace para versões recentes pode parecer uma tarefa simples à primeira vista. Mas, quando falamos de um monorepo Nx com múltiplos apps, bibliotecas compartilhadas, uma base de código considerável e várias major versions para atualizar, na prática, a tarefa se torna desafiadora — até mesmo para equipes experientes.
Neste artigo, compartilho a jornada de atualização do Angular 12 para o 17 em um monorepo Nx, destacando os principais desafios enfrentados, decisões tomadas e lições aprendidas.
Razões para atualizar
Embora não seja possível expor razões estratégicas internas, algumas motivações comuns para atualizações desse tipo incluem:
- Compatibilidade com bibliotecas que exigem versões mais recentes do framework;
- Aproveitar novos recursos introduzidos em versões mais recentes (Standalone Components, Signals, melhorias no compilador, etc.);
- Segurança e manutenção, evitando dependências descontinuadas;
- Melhoria de performance em build, testes e execução da aplicação.
A estratégia inicial
A primeira abordagem foi seguir o caminho "oficial" recomendado pelas ferramentas:
- Atualizar uma major version por vez (12 ➜ 13 ➜ 14 ➜ ... ➜ 17);
- Utilizar
nx migrate
enx migrate --run-migrations
para manter a compatibilidade do Nx a cada passo, verificando qual a versão do Nx compatível com a versão do Angular através da Matriz de compatibilidade de versão do Angular e Nx; - Utilizar o Guia de Atualização do Angular para identificar breaking changes e ajustes necessários;
- Garantir o build das aplicações antes de prosseguir para a próxima versão.
Seguindo a matriz de compatibilidade e este guia, o caminho para a atualização de cada versão foi:
Angular 13
nx migrate 14.1.9
Verifique seu package.json
e o arquivo migrations.json
gerado. Posteriormente, basta aplicar as migrações com:
nx migrate --run-migrations --create-commits
Angular 14 e Angular 15
Apesar da estratégia de migrar uma major version por vez, ao executar nx migrate 15.2.0
, o pacote @nrwl/angular
trouxe as migrações necessárias para levar o Angular até a versão 15.0.0. Decidi que isso não traria problemas, pois ainda estaríamos seguindo a recomendação de atualizar uma versão major por vez.
nx migrate 15.2.0
Verifique seu package.json
e o arquivo migrations.json
gerado. Posteriormente, basta aplicar as migrações com:
nx migrate --run-migrations --create-commits
Angular Material 15
Um dos pontos mais críticos da atualização foi a migração para o Angular Material 15, que mudou a forma de definir paletas, tipografia e temas. Além disso, houve a alteração dos componentes para MDC-based components. Este guia foi crucial para realizar o upgrade.
Angular 16, 17 e Mudança de Planos
Nesse ponto da atualização, ao tentar executar o nx migrate
para qualquer versão, eu enfrentava uma série de erros diferentes. Além disso, meu prazo estava se aproximando do fim. Eu sabia que havia algo errado com meu workspace — talvez uma configuração incorreta ou a falta de alguma versão necessária de alguma dependência do Nx.
Ao mesmo tempo, eu sabia que a parte crítica da atualização tinha sido superada. De acordo com o Guia de Atualização do Angular, poucas breaking changes das versões 16 e 17 afetavam meu projeto de forma significativa.
Nesse momento, decidi fazer uma mudança de planos e seguir com uma abordagem manual e direta:
- Criei um novo workspace Nx utilizando a versão 17.3.0, com o intuito de verificar as diferenças com relação ao meu workspace;
- Alterar manualmente o que estava discrepante;
- Ignorar a versão 16, que traria pouco valor isoladamente;
- Atualizar o Angular e o Nx diretamente para a versão 17;
- Abandonar o
nx migrate
, realizando atualizações manuais das dependências e ajustes noproject.json
/tsconfig
.
Essa abordagem foi mais arriscada, mas reduziu o tempo total e permitiu focar nos breaking changes mais relevantes, já no estado final desejado.
Finalizando o upgrade
A última etapa da atualização envolveu atualizar bibliotecas internas e externas para versões compatíveis, verificar o build das aplicações e corrigir erros pontuais.
Conclusão
Migrar do Angular 12 para o 17 em um monorepo Nx não é apenas trocar versões no package.json
. É um processo que envolve:
- Conhecer as mudanças entre cada versão;
- Ajustar bibliotecas internas e externas;
- Tomar boas decisões sobre o caminho a ser percorrido.
Se você planeja uma migração parecida, estude os breaking changes, valide a compatibilidade Nx/Angular e esteja pronto para lidar com ajustes inesperados — eles certamente vão aparecer.