Para de usar `npm install` pra instalar dependências.
Tenho duas perguntas pra ti:
- Tu inclui o
package-lock.json
no teu controle de versão? - Tu usa
npm install
pra instalar dependências de um projeto quando só quer rodar ele?
Vou procurar responder aqui o que acho que é correto, sempre considerando a possibilidade de estar errado e aberto à crítica de vocês.
Sim, tu deveria colocar o package-lock.json
no controle de versão, e atualizar ele sempre que é alterado. Não, tu não deveria usar npm install
pra meramente instalar as dependências de um repositório que clonou ou deu pull.
A ideia toda do package-lock.json
é manter as dependências da tua aplicação reprodutíveis. Clonou um repositório e só quer rodá-lo? O package-lock.json
garante que, em qualquer lugar que ele seja clonado, as dependências que vão ser baixadas sejam iguais.
Mas, pra fins de manter essa reprodutibilidade, tu não pode chegar lá e alterar o arquivo bem na hora que vai baixar as dependências. O package.json
sabe quais as dependências imediatas que tu especificou, mas só o package-lock.json
sabe que subdependências estas dependências estão usando.
Pois bem: são exatamente alterações inadvertidas que o npm install
acaba fazendo. Ele potencialmente atualiza as dependências de dependências dentro do package-lock.json
, o que é uma boa, mas deveria ser feito conscientemente e não por acidente -- e, se feito, deveria ser atualizado no controle de versão também. A questão é que, se tu muda teu package-lock.json
toda vez que instala dependências... bem, acho que é o mesmo que não ter o arquivo.
Deste modo, pra só instalar as dependências de um repositório antes de rodá-lo, o correto (até onde eu tenha sido capaz de confirmar) seria usar o comando npm ci
. Algumas pessoas veem este comando usado em Dockerfile
s e similares, e parecem acreditar que o comando tenha diretamente a ver com "continuous integration". Mas, na verdade, o ci
neste caso significa clean install
. O que ele faz? Ele baixa as dependências sem alterar o package.json
ou o package-lock.json
. Se ambos os arquivos estão fora de sincronia, caso que pode ocorrer quando alterações ao package-lock.json
não são atualizadas no controle de versão, o npm ci
falha, e daí, sim, pode-se usar o npm install
para arrumar a coisa toda. Mas ocorrências como estas deveriam ser raras, e rodar o npm install
deveria ser usado somente para instalar novas dependências (e talvez pra instalar atualizações destas e suas próprias subdependências? Sinceramente não tenho certeza).
Takeaways
- Usa o
npm install
pra adicionar dependências - Usa o
npm ci
para recriar o ambiente de dependências de um repositório pra rodar ele - Outra coisa: usa o
npm uninstall
pra remover uma dependência, isto deve alterar opackage-lock.json
; não é só ir lá e manualmente apagar a linha que lista a dependência
Novamente, fico aberto a observações com possíveis melhorias, ou que demonstrem que estou equivocadamente propondo algo que não é melhor prática. Agradeço pela atenção de vocês.