Para de usar `npm install` pra instalar dependências.
Tenho duas perguntas pra ti:
- Tu inclui o
package-lock.jsonno teu controle de versão? - Tu usa
npm installpra 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 Dockerfiles 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 installpra adicionar dependências - Usa o
npm cipara recriar o ambiente de dependências de um repositório pra rodar ele - Outra coisa: usa o
npm uninstallpra 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.