Como gerenciar as dependências npm sem enlouquecer?

Francesca1967 IT 📗 Estudante 👁 69 ⚑ Denunciar Programação

Estou trabalhando em um projeto React bem grande e toda vez que instalo um novo package acabo com conflitos de versão absurdos. Tentei usar npm ci mas não funciona sempre, principalmente quando estou colaborando com outras pessoas. Tem um jeito mais inteligente de lidar com isso sem precisar refazer tudo do zero?

3 respostas

★ Melhor resposta

Nunca toque o `package-lock.json` manualmente, é o primeiro erro!

O que me ajudou bastante foi usar `npm ci` localmente e principalmente configurar um `.npmrc` com `save-exact=true` no projeto, assim quando você instala algo novo salva as versões exatas em vez de usar `^` e `~` que causam bagunça. Depois adiciona um pre-commit hook com husky que bloqueia quem tenta fazer commit de um `package-lock.json` quebrado - é simples mas funciona demais porque o time não consegue estragar tudo por acaso.

E se você realmente precisa adicionar um package, faça sempre com `npm install --save-exact nomepackage` e deixa alguém revisar antes de fazer push!

Quando você tem esses conflitos, geralmente acontece quando instala pacotes novos com `npm install` sem verificar o que faz ao `package-lock.json`, certo?

O problema é que npm é um pouco flexible demais por padrão. Primeira coisa, garanta que todo mundo no time use `npm ci` no lugar de `npm install` quando tá trabalhando em um projeto já iniciado. A diferença é que `npm ci` lê exatamente o que tem em `package-lock.json` sem modificar, enquanto `install` fica fazendo upgrade de patch e minor version quando quer. Se você usa `npm install` pra adicionar coisa nova e depois faz push do lock file, os outros acabam com versões diferentes. Além disso, sempre commita o `package-lock.json` no repositório - parece óbvio mas muita gente não faz e depois fica se perguntando por que o build falha.

Para pacotes novos, usa `npm install --save-exact` se você realmente quer congelar uma versão específica, ou dá uma olhada em tools tipo `npm audit` pra verificar se tem conflitos de dependência conhecidos. Se o problema é bem grave com várias dependências aninhadas, considera também usar `npm dedupe` de vez em quando pra limpar a árvore de dependências. Na real, você também poderia tentar pnpm ou yarn se tiver a fim de mudar de ecosystem - eles gerenciam dependências de um jeito mais organizado - mas se quiser ficar com npm, respeitar o fluxo `ci` + `package-lock.json` no git deveria resolver a maioria dos problemas.

Francesca1967 asker Sim, sempre fazemos commit do lock file. O problema é que alguns colegas ainda usam `npm install` para adicionar novos pacotes. Vou tentar padronizar em `npm ci` e `--save-exact` para os novos pacotes.

A coisa que realmente me salvou foi usar `npm ci` sempre, mas principalmente insistir que todo o time fizesse isso - não `npm install`. No momento em que alguém faz um `install` padrão para adicionar um package, o `package-lock.json` se modifica de formas estranhas e aí os outros se veem fazendo merge conflicts absurdos. O que eu faço é usar `npm install <package> --save` só quando preciso adicionar coisa nova, e deixo que o lock file se atualize, aí committa tudo junto com os outros.

Mas o truque de verdade é configurar as versões no `package.json` com ranges mais conservadores - tipo `^16.0.0` em vez de `*` - assim o React não se atualiza para uma minor version que quebra tudo. Vi projetos grandes onde simplesmente colocaram um arquivo `.npmrc` comum no repo com `save-exact=true`, assim cada package novo fica pinado a uma versão precisa. É mais rígido, mas pelo menos você não enlouquece quando colabora.

Sua resposta

Entrarpara responder.