Ter pacotes de terceiros em nosso projeto é algo comum. Porém mante-los atualizados, infelizmente, não faz parte da rotina de muitos profissionais. Negligenciar esse processo pode acarretar em muitos problemas no futuro.
Este artigo trata dos motivos e estratégias como manter as dependências dos projetos sempre atualizadas.
Motivação
Software não é algo estático, esta em constante mudança e evolução. O mesmo se aplica as dependências que utilizamos em nossos projetos. E como dependências temos não apenas pacotes/código de terceiros, mas também a própria plataforma/linguagem que utilizamos.
Linguagem/Plataforma
Tão importante quanto manter a base de código atualizada, é manter a linguagem/plataforma que esta sendo utilizada atualizada.
O node monitora sua performance ao longo do tempo, garantindo que cada versão esta com mais performance ou que não houve regressão na performance. Sem contar todas as brechas de segurança que são corrigidas a cada nova versão.
Isso significa que manter o Node.js atualizado fornece mais performance e segurança.
Pacotes de terceiros
Manter o projeto atualizado garante que o projeto não irá sofrer com esse bugs e potenciais falhas de segurança. Além de potenciais ajustes que melhoram a performance de alguma coisa do pacote.
É importante lembrar que pacotes também tem dependências, elas também podem e precisam ser atualizadas.
Identificar que um pacote esta com suas dependências desatualizadas, é uma boa possibilidade de contribuição. Não é incomum brechas de segurança justamente em cenários como esses.
O NPM mantém uma lista de vulnerabilidades detectadas além do próprio npm possuir um recurso que analisa o package.json do projeto em busca de problemas. o Yarn possui um recurso similar.
Também é possível usar ferramentas que verificam automaticamente e constantemente o projeto.
O snyk.io é uma delas, com suporte a várias linguagens.
Frequência
Em um mundo ideal todos os dias os projetos seriam verificados sobre possíveis atualizações.
Porém não são todos os projetos que possuem recursos para usar ferramentas que automaticamente analisam isso, como greenkeeper.io e renovatebot.com
Uma forma para se manter uma boa frequência de verificações é fazer isso sempre que for mexer no projeto. Porém, há projetos que podem ficar várias semanas sem uma modificação. Para esses casos uma rotina recorrente de verificações é necessária.
Talvez um tarefa da sprint só para isso, a cada 15 dias.
Break changes, quebra de versão, incompatibilidades...
Não é incomum as dependências de um projeto mudarem de tal forma que seja necessário alguma mudança no código do projeto, um processo de migração ou adequação.
Em geral é o maior problema com atualizações, porém há formas de se lidar com quebras de versões.
Manter a frequência de verificação de atualizações garante um baixo acumulo de atualizações, e com isso uma maior facilidade de lidar com essas quebras.
Versionamento Semântico (Semantic Version)
A melhor forma de avaliar a compatibilidade entre as versões de uma ferramenta é o semver.
Dependências que seguem essa metodologia de versionamento deixam clara a compatibilidade entre suas versões. É necessário cuidado com ferramentas que não seguem esse modelo de versionamento, pois é impossível prever possíveis incompatibilidades.
Dado um número de versão MAJOR.MINOR.PATCH, incremente a:
1. versão Maior(MAJOR): quando fizer mudanças incompatíveis na API,
2. versão Menor(MINOR): quando adicionar funcionalidades mantendo compatibilidade, e
3. versão de Correção(PATCH): quando corrigir falhas mantendo compatibilidade.
Rótulos adicionais para pré-lançamento(pre-release) e metadados de construção(build) estão disponíveis como extensão ao formato MAJOR.MINOR.PATCH.
Changelogs / Release Notes
É a melhor forma de documentar a evolução de um pacote ou ferramenta ao longo do tempo. Changelogs mantém um histórico de mudanças, além de possíveis quebras de versão. É importantíssimo sempre verificar essas anotações quando se atualiza alguma dependência.
Algumas dependências além do changelog, mantém um release notes (notas de lançamento) para cada nova versão. As vezes esse release notes é usado apenas em caso de mudanças mais expressivas.
Com base nesses documentos, é possível não apenas prevenir de quebras de versões inconvenientes, como também saber de novos recursos que podem ser relevantes ao projeto.
Quando há uma quebra de versão que impacte o projeto, nem sempre é algo que possa ser modificado/ajustado naquele momento. Porém, ao obter essa informação é possível se programar para faze-lo em outro momento mais propício.
Se você é um mantenedor de algum pacote, não deixe de gerar changelogs, no minimo documente os releases de novas versões.
Há ferramentas criadas para ajudar nesse processo.
Testes Automatizados
Testes ainda serão a melhor forma de garantir que ao atualizar alguma dependência o projeto continuará funcionando como o previsto. A necessidade de se manter o projeto atualizado e livre de riscos só reforçam essa necessidade.
Testes automatizados infelizmente não são uma realidade para muitos profissionais e empresas, por diversos motivos.
Não é o objetivo deste artigo se aprofundar neste tópico, porém uma dica pode ser dada: focar o esforço em aprender a escrever código testável, esta sim é a maior dificuldade de quem ainda não sabe como trabalhar com testes.
Como atualizar as dependências
Não é necessário verificar manualmente dependência por dependência. Tanto o yarn quanto o npm possuem ferramental para isso.
yarn upgrade
npm update
O yarn possui mais opções para esse processo
yarn upgrade --scope @vue --latest
yarn upgrade left-pad --pattern "gulp|grunt"
yarn upgrade-interactive
yarn upgrade-interactive --latest
O mais interessante é o yarn upgrade-interactive
seguido do argumento --latest
. Esta combinação exibe uma lista interativa com as últimas versões disponíveis das dependências do package.json
.
Se quiser saber mais sobre meu trabalho visite dev.to/codecasts ou blog.codecasts.com.br. Assine nosso canal no YouTube, lá você vai ver vídeos sobre JavaScript, jQuery, Gulp, ES6, Vue.JS e muito mais. Também não deixe de entrar em contato pelo nosso grupo no Telegram
Top comments (5)
Muito bom! Obrigada pelas dicas e orientações! Adorei o artigo
Excelente conteúdo! Estava mesmo precisando disso.
Excelente conteúdo! Atualizar as devDependencies é tão importante quanto atualizar as dependencies do projeto?
Certamente.
Claro que a importância pode variar, mas pense no TypeScript por exemplo...
Ele sempre esta evoluindo, corrigindo a si mesmo e introduzindo novos recursos... Manter ele atualizado é importante.
Vale um esforço resolver problemas de versão dele por exemplo...
Já uma lib menor, de uso mais controlado... pode não valer o esforço.
Conteúdo impecável!