npm install ou npm ci: qual usar, e onde
São dois comandos parecidos com um propósito diferente, e trocá-los é a causa daquele clássico: "na minha máquina funciona".
1. O que cada um faz ao lockfile
npm installlê opackage.json, resolve o que couber nos intervalos de versões, instala — e reescreve opackage-lock.jsonse encontrar algo mais recente que caiba.npm ciignora essa liberdade: instala exatamente o que está no lockfile. Se o lockfile não corresponder aopackage.json, falha em vez de improvisar.
É essa última frase que faz toda a diferença. Um npm install num servidor de integração pode instalar hoje uma versão que ontem não existia — e é assim que uma alteração numa dependência de uma dependência chega a produção sem ninguém ter escrito uma linha.
2. A regra prática
# Ao desenvolver, quando quero mesmo mexer nas dependências
npm install alguma-biblioteca
# Em qualquer sítio automático: CI, imagem Docker, servidor
npm ciO npm ci apaga o node_modules antes de instalar, o que também elimina a categoria de erros que começa com "mas eu tinha isso instalado".
3. O lockfile comita-se
Sempre. É ele que faz com que a sua máquina, a do colega e o servidor instalem a mesma árvore de dependências, até à última. Um projeto sem lockfile versionado não tem instalações reprodutíveis — tem instalações parecidas.
4. Coisas que valem a pena saber
npm ci --omit=devsalta as dependências de desenvolvimento — é o que se quer na imagem de produção.npm ciexige o lockfile. Num projeto que não o tenha, começa por umnpm installe comita o resultado.npm outdatedmostra o que está para trás sem mexer em nada;npm updatesobe dentro dos intervalos permitidos.npm auditnão instala nada. Diz o que se sabe sobre o que já lá está.