Respostas:
Nos documentos da npm :
Em resumo, as principais diferenças entre o uso do npm install e do npm ci são:
- O projeto deve ter um pacote-lock.json ou npm-shrinkwrap.json existente.
- Se as dependências no bloqueio do pacote não corresponderem às do package.json, o npm ci será encerrado com um erro, em vez de atualizar o bloqueio do pacote.
- O npm ci pode instalar projetos inteiros por vez: dependências individuais não podem ser adicionadas com este comando.
- Se um node_modules já estiver presente, ele será removido automaticamente antes que o npm ci inicie sua instalação.
- Ele nunca gravará no package.json ou em qualquer um dos bloqueios de pacotes: as instalações são essencialmente congeladas.
Essencialmente,
npm install
lê package.json
para criar uma lista de dependências e usa package-lock.json
para informar quais versões dessas dependências instalar. Se não houver uma dependência, package-lock.json
ela será adicionada pornpm install
.
npm ci
(nome de C ontinuous eu ntegração) instala dependências directamente a partir de package-lock.json
e utilizações package.json
apenas para validar que não existem versões diferentes. Se alguma dependência estiver ausente ou tiver versões incompatíveis, ocorrerá um erro .
Use npm install
para adicionar novas dependências e atualizar dependências em um projeto. Geralmente, você o usaria durante o desenvolvimento depois de extrair alterações que atualizam a lista de dependências, mas pode ser uma boa ideia usar npm ci
neste caso.
Use npm ci
se você precisar de uma construção determinística e repetível. Por exemplo, durante a integração contínua, trabalhos automatizados, etc. e ao instalar dependências pela primeira vez, em vez de npm install
.
npm install
npm-shrinkwrap.json
e package-lock.json
(nessa ordem).node_modules
.package.json
ou package-lock.json
.
npm i packagename
), ele pode escrever package.json
para adicionar ou atualizar a dependência.npm i
) ele pode escrever para package-lock.json
bloquear a versão de algumas dependências se elas ainda não estiverem nesse arquivo.npm ci
package-lock.json
ou npm-shrinkwrap.json
estar presente.package.json
.node_modules
e instala todas as dependências uma só vez.package.json
ou package-lock.json
.Enquanto npm ci
gera a árvore de dependência inteira de package-lock.json
ou npm-shrinkwrap.json
, npm install
atualiza o conteúdo donode_modules
uso do seguinte algoritmo ( origem ):
load the existing node_modules tree from disk clone the tree fetch the package.json and assorted metadata and add it to the clone walk the clone and add any missing dependencies dependencies will be added as close to the top as is possible without breaking any other modules compare the original tree with the cloned tree and make a list of actions to take to convert one to the other execute all of the actions, deepest first kinds of actions are install, update, remove and move
npm install package
poderia modificar tanto package-lock.json
e package.json
, ao mesmo tempo npm install
argumentos whithout só iria modificarpackage-lock.json
npm ci
excluirá qualquer pasta node_modules existente e depende do package-lock.json
arquivo para instalar a versão específica de cada pacote. É significativamente mais rápido que a instalação npm porque ignora alguns recursos. Sua instalação em estado limpo é excelente para pipelines ci / cd e builds de docker! Você também o usa para instalar tudo de uma vez e não pacotes específicos.
A documentação que você vinculou tinha o resumo:
Em resumo, as principais diferenças entre o uso do npm install e do npm ci são:
- O projeto deve ter um pacote-lock.json ou npm-shrinkwrap.json existente.
- Se as dependências no bloqueio do pacote não corresponderem às do package.json, o npm ci será encerrado com um erro, em vez de atualizar o bloqueio do pacote.
- O npm ci pode instalar projetos inteiros por vez: dependências individuais não podem ser adicionadas com este comando.
- Se um node_modules já estiver presente, ele será removido automaticamente antes que o npm ci inicie sua instalação.
- Ele nunca gravará no package.json ou em qualquer um dos bloqueios de pacotes: as instalações são essencialmente congeladas.
Os comandos são muito semelhantes em funcionalidade, no entanto, a diferença está na abordagem adotada para instalar as dependências especificadas nos arquivos package.json
e package-lock.json
.
npm ci
executa uma instalação limpa de todas as dependências do seu aplicativo, enquanto npm install
pode pular algumas instalações se elas já existirem no sistema. Pode ocorrer um problema se a versão já instalada no sistema não for a que você package.json
pretende instalar, ou seja, a versão instalada for diferente da versão ' necessária versão ' '.
Outras diferenças seriam que npm ci
nunca tocam seus package*.json
arquivos. Parará a instalação e mostrará um erro se as versões de dependência não corresponderem no package.json
epackage-lock.json
arquivos .
Você pode ler uma explicação muito melhor dos documentos oficiais aqui .
Além disso, você pode ler sobre bloqueios de pacotes aqui .
Vale lembrar que as imagens do docker do nó de luz, como o alpino, não possuem o Python instalado, cuja dependência node-gyp
é usada pelonpm ci
.
Eu acho que é um pouco opinativo que, para ter npm ci
funcionando, você precisa instalar o Python como dependência em sua compilação.
Mais informações aqui Docker e npm - gyp ERR! não está tudo bem
Você deve usá-los em diferentes situações.
npm install
é ótimo para desenvolvimento e no IC quando você deseja armazenar em cache o node_modules
diretório. Quando usar isso? Você pode fazer isso se estiver criando um pacote para uso de outras pessoas (você NÃO o inclui node_modules
em um release) . Com relação ao armazenamento em cache, tenha cuidado, se você planeja suportar versões diferentes do Node.js
Lembre-se de que node_modules
talvez seja necessário reinstalar devido a diferenças entre os Node.js
requisitos de tempo de execução. Se você deseja manter uma versão, siga a mais recente LTS
.
npm ci
deve ser usado quando você for testar e liberar um aplicativo de produção (um produto final, não para ser usado por outros pacotes), pois é importante que você tenha a instalação o mais determinista possível, essa instalação levará mais tempo, mas acabará tornando seu aplicativo mais confiável (você inclui node_modules
nessa liberação) . Fique com a LTS
versão do Node.js
.
Bônus: você pode misturá-los dependendo de quão complexo você deseja torná-lo. Nas ramificações de recursos, git
você pode armazenar em cache node_modules
para aumentar a produtividade de suas equipes e, mediante solicitação de mesclagem, as ramificações principais dependem npm ci
de um resultado determinístico.
npm install
poderia escrever para package.json. Você sabe o que poderia escrever aqui?