Recentemente, atualizei para npm @ 5 . Agora tenho um arquivo package-lock.json com tudo, desde package.json . Eu esperava que, ao executar, npm install
as versões de dependência fossem extraídas do arquivo de bloqueio para determinar o que deveria ser instalado no meu diretório node_modules . O estranho é que ele acaba modificando e reescrevendo meu arquivo package-lock.json .
Por exemplo, o arquivo de bloqueio tinha o texto datilografado especificado para a versão 2.1.6 . Depois do npm install
comando, a versão foi alterada para 2.4.1 . Isso parece derrotar todo o objetivo de um arquivo de bloqueio.
o que estou perdendo? Como faço para que o npm respeite meu arquivo de bloqueio?
node.js
npm
npm-install
package-lock.json
Viper Bailey
fonte
fonte
package-lock.json
é regenerado quando eu corronpm install
. Isso cheira a um erro npm. Você usa seu próprio registro?--no-save
impede a alteração do arquivo de bloqueio, mas não afeta a atualização de dependência de primeiro nível que o OP menciona.Respostas:
Atualização 3: Como outras respostas também apontam, o
npm ci
comando foi introduzido na npm 5.7.0 como forma adicional de obter compilações rápidas e reproduzíveis no contexto do IC. Consulte a documentação e o blog do npm para obter mais informações.Atualização 2: O problema para atualizar e esclarecer a documentação é o problema no GitHub # 18103 .
Atualização 1: O comportamento descrito abaixo foi corrigido na npm 5.4.2: o comportamento pretendido atualmente é descrito na edição # 17979 do GitHub .
Resposta original: o comportamento de
package-lock.json
foi alterado na npm 5.1.0, conforme discutido na edição # 16866 . O comportamento que você observa é aparentemente planejado pelo npm a partir da versão 5.1.0.Isso significa que
package.json
pode substituirpackage-lock.json
sempre que uma versão mais recente for encontrada para uma dependência nopackage.json
. Se você deseja fixar suas dependências efetivamente, agora deve especificar as versões sem um prefixo; por exemplo, você precisa escrevê-las como em1.2.0
vez de~1.2.0
ou^1.2.0
. Em seguida, a combinação depackage.json
epackage-lock.json
produzirá construções reproduzíveis. Para ficar claro:package-lock.json
sozinho já não bloqueia as dependências no nível raiz!Se essa decisão de projeto foi boa ou não, é discutível, há uma discussão em andamento resultante dessa confusão no GitHub na edição # 17979 . (Aos meus olhos, é uma decisão questionável; pelo menos o nome
lock
não se aplica mais.)Mais uma observação: há também uma restrição para registros que não suportam pacotes imutáveis, como quando você extrai pacotes diretamente do GitHub em vez de npmjs.org. Consulte esta documentação dos bloqueios de pacotes para obter mais explicações.
fonte
npm update
? : o Eu tive o mesmo pressentimento que osnpm install
deps atualizados, mas não quero acreditar ... mas parece que é verdade. De qualquer forma, ainda há uma opção a ser usadanpm shrinkwrap
para bloquear deps, mas definitivamente o nome do pacote-lock está incorreto uma vez que não congela, nem dependências de bloqueio ..Eu descobri que haverá uma nova versão do npm 5.7.1 com o novo comando
npm ci
, que será instaladopackage-lock.json
apenasfonte
npm install
" antes de executar o comandonpm ci
nesse projeto. Nãonpm install
substitui o arquivo package-lock.json?npm
apenas altera o arquivo de bloqueio, se necessário, para atender às especificações em packages.json . Portanto, se os pacotes costumavam dizerthatpackage: 1
, e lock diz..: 1.0.4
, o dev pode editar para dizerthatpackage: 2
- e isso forçará a alteração do arquivo de bloqueio, porque1.0.4
não é compatível com o novo intervalo especificado. Se não mudarpackages.json
, permanecerá bloqueado na versão exata, até excluir o arquivo de bloqueio. [Se não permanecer bloqueado e não alterar o packages.json, envie um relatório de bug.] #Use o recém-introduzido
Apresentando construções
npm ci
mais rápidas e confiáveisfonte
npm ci
enpm install
atualizamos ou instalamos novos pacotes.node_modules
diretório existente e reconstrói localmente, mesmo que seja um link simbólico vazio, mas importante. :(npm ci
, espero que eles relutem muito em introduzir qualquer coisa que possa reduzir o desempenho para um caso de uso bastante incomum. Você pode querer consultar o pnpm.js.org, apesar de usar links físicos para reduzir o uso do disco.Resposta curta:
npm install
honra o package-lock.json apenas se atender aos requisitos do package.json.npm ci
.Aqui está um cenário que pode explicar as coisas (verificado com o NPM 6.3.0)
Você declara uma dependência no package.json como:
Então você faz, o
npm install
que irá gerar um package-lock.json com:Poucos dias depois, uma versão menor mais nova de "depA" é lançada, diga "1.1.0", e o seguinte é verdadeiro:
Em seguida, você atualiza manualmente o seu package.json para:
Em seguida, execute novamente:
fonte
npm install
usará as versões bloqueadas apackage-lock.json
menos que não satisfaça opackage.json
caso em que instala o package.json e reconstrói o package-lock.json de acordo. Se você alterou o seupackage.json
de tal maneira que o bloqueio de pacote existente ainda satisfaz a atualização,package.json
ele continuará a usá-lo #package-lock
npm install
não fará nada, independentemente do package-lock.json. Temos que atualizar explicitamente os pacotes, mesmo quando houver atualizações disponíveis que correspondam ao semver especificado em package.json. Pelo menos essa tem sido minha experiência há anos.node_modules
satisfizer o intervalopackage.json
e não houverpackage-lock.json
arquivo, o npm não atualizará o módulo durante a execuçãonpm install
. Eu acho que está bom, já que você pode usarnpm update
(ounpm-check
mais recente) para atualizar dependências, e esse comportamento é mais rápido no caso de alguém apenas adicionar uma entradapackage.json
e não querer que pacotes não relacionados se atualizem para a mais recente que satisfaça a sem-ver alcance.Use o
npm ci
comando em vez denpm install
."ci" significa "integração contínua".
Ele instalará as dependências do projeto com base no arquivo package-lock.json, em vez das dependências do arquivo package.json.
Produzirá versões idênticas às de seus companheiros de equipe e também será muito mais rápido.
Você pode ler mais sobre isso nesta postagem do blog: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
fonte
ci
refere-se à "integração contínua", conforme mencionado na documentação e na postagem do blog que anuncia o comando: blog.npmjs.org/post/171556855892/…node_modules
pasta e a recriará do zero. É realmente muito mais rápido? A pasta também énpm install
excluídanode_modules
?npm install
tem que resolver todas as dependências do pacote quando executado.npm ci
é apenas uma lista de compras de "obtenha esses módulos exatos".No futuro, você poderá usar um
--from-lock-file
sinalizador (ou similar) para instalar somente a partir dopackage-lock.json
sem modificá-lo.Isso será útil para ambientes de CI, etc. em que construções reproduzíveis são importantes.
Consulte https://github.com/npm/npm/issues/18286 para rastrear o recurso.
fonte
npm ci
também trata da sua pergunta.Parece que esse problema foi corrigido na npm v5.4.2
https://github.com/npm/npm/issues/17979
(Role para baixo até o último comentário no tópico)
Atualizar
Realmente corrigido em 5.6.0. Houve um erro de plataforma cruzada na 5.4.2 que estava causando o problema ainda ocorria.
https://github.com/npm/npm/issues/18712
Atualização 2
Veja minha resposta aqui: https://stackoverflow.com/a/53680257/1611058
npm ci
é o comando que você deve usar ao instalar projetos existentes agora.fonte
npm i
. Por exemplo, o módulofsevents
é removido quando eu estivernpm i
em uma máquina que não oferece suportefsevents
e, em seguida, o módulo é adicionadonpm i
novamente quando outra vez em uma máquina que suporta.fsevents
queda na minhapackage-lock.json
com[email protected]
colaborando com contribuidores Mac OS X. Se você não abriu um problema, eu irei.Você provavelmente tem algo como:
no
package.json
qual npm é atualizado para a versão secundária mais recente, no seu caso2.4.1
Mais sobre
package-lock.json
:O package-lock.json é gerado automaticamente para qualquer operação em que o npm modifique a árvore node_modules ou o package.json. Ele descreve a árvore exata que foi gerada, de forma que as instalações subseqüentes possam gerar árvores idênticas, independentemente das atualizações intermediárias de dependência.
Este arquivo deve ser confirmado nos repositórios de origem e serve a vários propósitos:
https://docs.npmjs.com/files/package-lock.json
fonte
package-lock.json
baixado e, em seguida, executamosnpm install
, mas opackage-lock.json
arquivo é modificado e precisamos fazer uma redefinição antes que possamos realizar as próximas alterações.Provavelmente você deve usar algo como isto
Ao invés de usar
npm install
se você não quiser alterar a versão do seu pacote.De acordo com a documentação oficial, ambos
npm install
enpm ci
instalar as dependências que são necessários para o projeto.fonte
Existe um problema em aberto na página do github: https://github.com/npm/npm/issues/18712
Esse problema é mais grave quando os desenvolvedores estão usando diferentes sistemas operacionais.
fonte
EDIT: o nome "lock" é complicado, seu NPM está tentando atualizar o Yarn. Não é um arquivo bloqueado.
package.json
é um arquivo fixo pelo usuário que, uma vez "instalado", gerará a árvore de pastas node_modules e a árvore será gravadapackage-lock.json
. Então, veja bem, é o contrário - as versões de dependência serão retiradaspackage.json
como sempre epackage-lock.json
devem ser chamadaspackage-tree.json
(espero que isso tenha esclarecido minha resposta depois de tantos votos negativos)
Uma resposta simplista:
package.json
tenha suas dependências como de costume, enquantopackage-lock.json
é "uma árvore node_modules exata e mais importante, reproduzível" (extraída do próprio npm docs ).Quanto ao nome complicado, seu NPM está tentando alcançar Yarn.
fonte