npm @ 5 foi publicado, ele possui um novo arquivo package-lock.json (after npm install
) que me confunde. Eu quero saber qual é o efeito desse arquivo?
Ele armazena uma árvore de dependência exata e com versão, em vez de usar versão com estrela, como o próprio package.json (por exemplo, 1.0. *). Isso significa que você pode garantir as dependências para outros desenvolvedores ou lançamentos de produtos, etc. Ele também possui um mecanismo para bloquear a árvore, mas geralmente será regenerado se o package.json mudar.
Desde os docs NPM :
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:
Descreva uma única representação de uma árvore de dependência, de modo que colegas de equipe, implantações e integração contínua garantam a instalação exatamente das mesmas dependências.
Forneça um recurso para os usuários "viajarem no tempo" para estados anteriores de node_modules sem precisar confirmar o próprio diretório.
Para facilitar uma maior visibilidade das alterações nas árvores por meio de diferenças de controle de fonte legíveis.
E otimize o processo de instalação, permitindo que o npm pule as resoluções repetidas de metadados para pacotes instalados anteriormente ".
Para responder à pergunta de jrahhali abaixo, basta usar o package.json com os números de versão exatos. Lembre-se de que seu package.json contém apenas suas dependências diretas, não as dependências de suas dependências (às vezes chamadas de dependências aninhadas). Isso significa que com o package.json padrão, você não pode controlar as versões dessas dependências aninhadas, referenciá-las diretamente ou como dependências de pares não ajudarão, pois você também não controla a tolerância de versão que suas dependências diretas definem para essas dependências aninhadas .
Mesmo se você bloquear as versões de suas dependências diretas, não poderá garantir 100% que sua árvore de dependência completa será idêntica todas as vezes. Em segundo lugar, convém permitir alterações sem interrupção (com base no controle de versão semântico) de suas dependências diretas, o que oferece um controle ainda menor das dependências aninhadas e, novamente, você não pode garantir que suas dependências diretas não quebrem as regras de controle de versão semânticas em algum momento si mesmos.
A solução para tudo isso é o arquivo de bloqueio que, conforme descrito acima, bloqueia as versões da árvore de dependência completa. Isso permite que você garanta sua árvore de dependência para outros desenvolvedores ou para liberações, enquanto ainda permite testar novas versões de dependência (direta ou indireta) usando o package.json padrão.
NB. O jink shrink wrap anterior fez praticamente a mesma coisa, mas o arquivo de bloqueio o renomeia para que sua função seja mais clara. Se já houver um arquivo de quebra de contração no projeto, ele será usado em vez de qualquer arquivo de bloqueio.
package-lock.json
arquivo está sendo atualizado toda vez que você chama o npm install desde o NPM 5.1. (alteração no github.com/npm/npm/issues/16866 , exemplo em github.com/npm/npm/issues/17979 ) Portanto, não pode mais ser usado para definir as mesmas versões para todos os desenvolvedores , a menos que você especifique versões exatas como em1.2.3
vez de1.2.*
no seupackage.json
arquivo.npm ci
comonpm install
atualizará o package-lock.json, enquanto ci usa seu conteúdo. Somente comnpm ci
você obterá versões robustas e repetíveis.É uma melhoria muito importante para o npm: garanta exatamente a mesma versão de cada pacote .
Como garantir que seu projeto seja construído com os mesmos pacotes em ambientes diferentes em um momento diferente? Digamos, você pode usar
^1.2.3
suaspackage.json
ou algumas de suas dependências dessa maneira, 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? O package-lock.json garantirá isso.npm install
irá gerar novamente o arquivo de bloqueio, quando estiver no servidor de compilação ou no servidor de implantação, façanpm ci
(que lerá o arquivo de bloqueio e instalará toda a árvore de pacotes)fonte
package-lock.json
arquivo. Apenas instalapackage.json
como antes. Para usar opackage-lock.json
arquivo, você deve usar o novo comando "npm ci", que instalará as versões exatas listadas empackage-lock.json
vez dos intervalos de versões fornecidos empackage.json
.npm install
se ler a partirpackage-lock.json
. Para reproduzir, faça o seguinte. usando este package.json, executenpm install
{... "devDependencies": {"sinon": "7.2.2"}} Agora copie / colepackage.json
epackage-lock.json
em um novo diretório. Mudepackage.json
para: "sinon": "^ 7.2.2" runnpm install
. O npm lê o pacote-lock.json e instala o 7.2.2 em vez do 7.3.0. Sem o package-lock.json, o 7.3.0 seria instalado.package-lock.json
, a única maneira razoável de fazer isso é excluípackage-lock.json
-lo e regenerá-lo usandonpm install
. (Você não deseja editar manualmentepackage-lock.json
). Alterar o valor da propriedade "version" (próximo à parte superior) depackage.json
mudará o mesmo parapackage-lock.json
onnpm install
, mas adicionar um sinal de intercalação a uma dependência não fará o mesmopackage-lock.json
.package.json
como algo que você pode modificar manualmente epackage-lock.json
como algo que você nunca toca manualmente. Você sempre controla os dois arquivos, especialmentepackage-lock.json
. Abra os dois arquivos, edite manualmente o nome do projetopackage.json
, executenpm install
e observe como o nome do projeto é alteradopackage-lock.json
.license
parece não estar gravadopackage-lock.json
.npm ci
,npm install
só vai usar package.json, mesmo que o arquivo de bloqueio é fornecidopackage-lock.json
é gravado quando um valor numérico em uma propriedade como a propriedade "version" ou uma propriedade de dependência é alterada empackage.json
.Se esses valores numéricos em
package.json
epackage-lock.json
correspondentespackage-lock.json
forem lidos.Se esses valores numéricos
package.json
epackage-lock.json
não corresponderem,package-lock.json
eles serão gravados com esses novos valores e novos modificadores, como o cursor e o til, se estiverem presentes. Mas é o numeral que está provocando a mudança parapackage-lock.json
.Para entender o que quero dizer, faça o seguinte. Usando
package.json
sempackage-lock.json
, executenpm install
com:package-lock.json
agora terá:Agora copie / cole os dois arquivos em um novo diretório. Mude
package.json
para (apenas adicionando circunflexo):correr
npm install
. Se não houvessepackage-lock.json
arquivo, [email protected] seria instalado.npm install
está lendo depackage-lock.json
e instalando 7.2.2.Agora mude
package.json
para:correr
npm install
.package-lock.json
foi gravado e agora mostrará:fonte
Uma coisa importante a mencionar também é a melhoria de segurança que acompanha o arquivo de bloqueio de pacote. Como ele mantém todos os hashes dos pacotes se alguém violar o registro público do npm e alterar o código-fonte de um pacote sem alterar a versão do pacote, ele será detectado pelo arquivo de bloqueio de pacotes.
fonte
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.
Ele descreve uma representação única de uma árvore de dependência, de modo que colegas de equipe, implantações e integração contínua garantam a instalação exatamente das mesmas dependências. Ele contém as seguintes propriedades.
}
fonte
Este arquivo é criado e usado automaticamente pelo npm para acompanhar as instalações do seu pacote e gerenciar melhor o estado e o histórico das dependências do seu projeto. Você não deve alterar o conteúdo deste arquivo.
fonte
package-lock.json: contém os detalhes exatos da versão atualmente instalados para o seu aplicativo.
fonte