O npm 5 foi lançado hoje e um dos novos recursos inclui instalações determinísticas com a criação de um package-lock.json
arquivo.
Esse arquivo deve ser mantido no controle de origem?
Eu estou assumindo que é semelhante ao yarn.lock
e composer.lock
, ambos os quais devem ser mantidos em controle de origem.
git log
facilita o manuseio.Respostas:
Sim,
package-lock.json
deve ser verificado no controle de origem. Se você estiver usando o npm 5, poderá ver isso na linha de comando:created a lockfile as package-lock.json. You should commit this file.
De acordo comnpm help package-lock.json
:fonte
package-lock.json
ao meu.gitignore
... estava me causando muito mais problemas do que resolvê-los. Ele sempre entra em conflito quando mesclamos ou reestruturamos, e quando uma mesclagem resulta em umapackage-lock.json
corrupção no servidor de IC, é apenas uma dor ter que ficar consertando-o.Sim, o objetivo é fazer check-in. Quero sugerir que ele obtenha seu próprio commit exclusivo. Descobrimos que ele adiciona muito ruído às nossas diferenças.
fonte
package-lock.json
arquivo ao trabalhar em um sistema SCM com troncos e ramificações? Estou fazendo algumas alterações em um ramo que precisa ser mesclado ao tronco ... agora tenho que (de alguma forma) resolver conflitos entre os doispackage-lock.json
arquivos? Isso parece doloroso.Sim você deveria:
package-lock.json
.npm ci
vez denpm install
criar seus aplicativos no seu CI e na sua máquina de desenvolvimento localO
npm ci
fluxo de trabalho requer a existência de apackage-lock.json
.Uma grande desvantagem do
npm install
comando é seu comportamento inesperado, que pode sofrer alteraçõespackage-lock.json
, enquantonpm ci
apenas usa as versões especificadas no arquivo de bloqueio e produz um erropackage-lock.json
epackage.json
estiver fora de sincroniapackage-lock.json
estiver faltando.Portanto, executando
npm install
localmente, esp. em equipes maiores com vários desenvolvedores, pode levar a muitos conflitos entre ospackage-lock.json
desenvolvedores e decidirem excluir completamente opackage-lock.json
arquivo.No entanto, existe um forte caso de uso para poder confiar que as dependências do projeto resolvem repetidamente de maneira confiável em diferentes máquinas.
De um,
package-lock.json
você obtém exatamente isso: um estado conhecido pelo trabalho.No passado, eu tinha projetos sem arquivos
package-lock.json
/npm-shrinkwrap.json
/yarn.lock
cuja construção falharia um dia porque uma dependência aleatória recebeu uma atualização de última hora.É difícil resolver esses problemas, pois às vezes você precisa adivinhar qual era a última versão de trabalho.
Se você deseja adicionar uma nova dependência, ainda executa
npm install {dependency}
. Se você deseja atualizar, use ounpm update {dependency}
ounpm install ${dependendency}@{version}
confirme a alteraçãopackage-lock.json
.Se uma atualização falhar, você poderá reverter para o último trabalho conhecido
package-lock.json
.Para citar o npm doc :
E no que diz respeito à diferença entre
npm ci
vsnpm install
:Nota: Eu publiquei uma resposta semelhante aqui
fonte
whose build would fail one day because a random dependency got a breaking update
tipo de problema. Embora deixe a possibilidade de dependência da criança, causando o mesmo problema.Sim, a melhor prática é fazer o check-in (SIM, CHECK-IN)
Concordo que causará muito barulho ou conflito ao ver o diff. Mas os benefícios são:
^1.2.3
no seupackage.json
, mas como você pode garantir que cada veznpm install
escolha a mesma versão em sua máquina de desenvolvimento e no servidor de compilação, especialmente aqueles pacotes de dependência indireta? Bem,package-lock.json
garantirá isso. (Com a ajuda denpm ci
que instala pacotes com base no arquivo de bloqueio)npm audit fix
(acho que o recurso de auditoria é da npm versão 6).fonte
npm ci
. As pessoas freqüentemente mencionam que apackage-lock.json
permite uma instalação determinística de pacotes, mas quase nunca menciona o comando que facilita esse comportamento! Muitas pessoas provavelmente supõem incorretamentenpm install
instala exatamente o que está no arquivo de bloqueio ...npm ci
. Sua equipe / desenvolvedor líder pode decidir quando atualizar. Se todo mundo está cometendo isso arbitrariamente, não há motivo para isso, e isso está apenas criando ruído em seu repositório. A documentação do NPM deve deixar isso mais claro. Eu acho que a maioria dos desenvolvedores está confusa com esse recurso.Não comprometo este arquivo nos meus projetos. Qual é o objetivo?
Embora seja verdade que eu nunca usei ^ no meu package.json para bibliotecas porque tive experiências ruins com ele.
fonte
package-lock.json
. Algumas operações compromissadas podem não exigir os benefícios advindos da sua incorporação e podem preferir não ter conteúdo gerado automaticamente na fonte.Para as pessoas reclamando do barulho ao fazer git diff:
O que eu fiz foi usar um alias:
Para ignorar o package-lock.json no diffs para todo o repositório (todos os que o usam), você pode adicioná-lo ao
.gitattributes
:Isso resultará em diferenças que mostram "Os arquivos binários a / package-lock.json eb / package-lock.json diferem sempre que o arquivo de bloqueio do pacote é alterado. Além disso, alguns serviços Git (principalmente o GitLab, mas não o GitHub) também excluem esses arquivos (não são mais de 10 mil linhas alteradas!) das diferenças ao exibir on-line ao fazer isso.
fonte
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
no meu .bashrc em vez de um alias.Sim, você pode confirmar este arquivo. Dos documentos oficiais da NPM :
fonte
npm ci
a instalação a partir do package-lock.jsonDesativar globalmente o package-lock.json
digite o seguinte em seu terminal:
isso realmente funciona para mim como mágica
fonte
~/.npmrc
(pelo menos no meu macos) com conteúdopackage-lock=false
e o mesmo pode ser feito em qualquer projeto específico ao ladonode_modules/
(por exemploecho 'package-lock=false' >> .npmrc
Sim, é uma prática padrão confirmar o pacote-lock.json
O principal motivo para confirmar o pacote-lock.json é que todos no projeto estão na mesma versão do pacote.
Prós: -
Contras: -
Edit: - O npm install não garante que todos no projeto estejam na mesma versão do pacote. O npm ci ajudará com isso.
fonte
npm ci
vez denpm install
.Meu uso do npm é gerar css / js minificado / uglificado e gerar o javascript necessário nas páginas atendidas por um aplicativo django. Nos meus aplicativos, o Javascript é executado na página para criar animações, às vezes executar chamadas ajax, trabalhar dentro de uma estrutura VUE e / ou trabalhar com o css. Se o package-lock.json tiver algum controle sobre o conteúdo do package.json, poderá ser necessário que exista uma versão desse arquivo. Na minha experiência, isso não afeta o que é instalado pelo npm install ou, se o fizer, não afetou de maneira adversa os aplicativos que implanto para o meu conhecimento. Eu não uso mongodb ou outros aplicativos que são tradicionalmente thin client.
Eu removo o package-lock.json do repo porque o npm install gera esse arquivo e o npm install faz parte do processo de implantação em cada servidor que executa o aplicativo. O controle de versão do nó e do npm é feito manualmente em cada servidor, mas tenho o cuidado de que eles sejam iguais.
Quando
npm install
é executado no servidor, ele altera o package-lock.json e, se houver alterações em um arquivo que é registrado pelo repositório no servidor, a próxima implantação WONT permitirá que você obtenha novas alterações da origem. Ou seja, você não pode implantar porque a solicitação substituirá as alterações feitas no package-lock.json.Você não pode sobrescrever um package-lock.json gerado localmente pelo que está no repositório (redefinir o hard origin master), pois o npm reclamará sempre que você emitir um comando se o package-lock.json não refletir o que está em node_modules devido à instalação do npm, interrompendo a implementação. Agora, se isso indica que versões ligeiramente diferentes foram instaladas no node_modules, mais uma vez isso nunca me causou problemas.
Se node_modules não estiver no seu repositório (e não deveria estar), o package-lock.json deve ser ignorado.
Se estiver faltando alguma coisa, corrija-me nos comentários, mas o ponto em que o versionamento é retirado desse arquivo não faz sentido. O arquivo package.json possui números de versão, e presumo que esse arquivo seja o usado para criar pacotes quando a instalação do npm ocorre, como quando eu o removo, o npm install reclama da seguinte maneira:
e a construção falhar, no entanto, ao instalar o node_modules ou ao aplicar o npm para construir o js / css, nenhuma reclamação será feita se eu remover o package-lock.json
fonte