有没有办法修复包锁。json lockfileVersion所以npm使用特定的格式?

如果两个不同的开发人员正在使用不同版本的node (12/15) &在一个最初使用package-lock.json "lockfileVersion": 1创建的项目中,当使用npm 7x的开发人员安装新包时,package-lock.json似乎是使用"lockfileVersion": 2重新创建的。

这似乎给使用npm v6的开发人员带来了问题,因为它试图与lockfileVersion 2一起工作,但它最终产生了新的差异。

npm WARN read-shrinkwrap这个版本的npm与lockfileVersion@1兼容,但是package-lock。json为lockfileVersion@2生成。我会尽力做到最好的!

有没有办法指定更新版本的npm只有使用"lockfileVersion": 1?或者我们只需要让所有的开发人员使用相同版本的npm?

290926 次浏览

有没有办法指定较新的npm版本只使用"lockfileVersion": 1?或者我们只需要让所有的开发人员使用相同版本的npm?

我会建议你固定Node/NPM版本,并在你的环境(开发、登台和生产)中对齐它。

你可以通过在你的项目中添加.nvmrc文件来利用nvm来管理Node版本(不要忘记将它存储在你的源代码控制中)。

例如,.nvmrc看起来像:

$ cat .nvmrc
14.15.0

然后,你可以使用nvm install && nvm use来使用Node的精简版本。

NPM也支持engines:

你可以指定你的东西工作的节点版本:

{ "engines" : { "node" : ">=0.10.3 <0.12" } }

并且,像依赖项一样,如果您没有指定版本(或者如果您指定"*"作为版本),那么任何版本的Node都可以。

如果你指定“引擎”;字段,那么NPM将要求“;node"在清单上的某个地方。如果“engines",那么npm将假设它在Node上工作。

你也可以使用“引擎”;字段指定哪些NPM版本能够正确安装您的程序。例如:

{ "engines" : { "npm" : "~1.0.20" } }

除非用户设置了引擎严格配置标志,否则该字段仅为建议字段,并且仅在包作为依赖项安装时才会产生警告。

当使用engines字段并使npm在版本约束不满足时失败时,在.npmrc文件中设置engine-strict=true(因为它是默认为false)或作为npm_config_engine_strict=true环境变量

如果设置为true,那么npm将顽固地拒绝安装(甚至考虑安装)任何声称与当前Node.js版本不兼容的包。

这可以通过设置——force标志来覆盖。

另一种方法是使用集装箱码头工人作为开发和执行的运行时环境,这意味着你既不需要安装Node,也不需要安装NPM。如。

$ mkdir my-project
$ cd my-project
$ docker run --rm -it -v $PWD:/app --entrypoint /bin/bash --workdir /app node:14.15.0
root@4da6ee3c2ac0:/app# npm init -y
Wrote to /app/package.json:


{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}




root@4da6ee3c2ac0:/app# npm install
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN app@1.0.0 No description
npm WARN app@1.0.0 No repository field.


up to date in 1.694s
found 0 vulnerabilities


root@4da6ee3c2ac0:/app# exit
exit
$ ls -x1
package-lock.json
package.json

如你所见,既没有Node,也没有NPM:

  1. 为新项目创建新目录
  2. 旋转一个Node Docker容器,它随Node和NPM一起提供
  3. 创建一个新项目(npm init -y)
  4. 退出Docker容器
  5. 列出容器旋转的工作目录中的文件

由于上面的docker run命令很长,你可能希望利用docker-compose来实现更精简的工作流。

据我所知,npm文档说npm v6将与版本2的锁文件一起工作,尽管有警告,所以你不需要做任何被接受的答案中建议的事情和可以安全地忽略警告消息。

NPM 7发布说明中,他们说:

需要注意的一个变化是新的lockfile格式,即 向后兼容NPM 6用户。锁文件v2解锁 能够进行确定的和可复制的构建以生成 包树。< / p >

npm文档中,它说(我的重点):

lockfileVersion

一个整数版本,从1开始,包含该版本号 生成此文件时使用其语义的文档 package-lock.json . < / p > 注意文件格式在npm v7中发生了显著的变化 否则需要在node_modules中查找的信息 或者是NPM注册表。npm v7生成的锁文件将包含 lockfileVersion: 2 . < / p >

  • 没有版本提供:一个&;来自NPM v5之前的NPM版本的Shrinkwrap文件。
  • 1: npm v5和v6使用的锁文件版本。
  • 2: npm v7使用的lockfile版本,它向后兼容于v1 lockfiles。
  • 3: npm v7使用的锁文件版本,不支持向后兼容。的隐藏锁文件 node_modules / .package-lock。Json,和可能会在未来使用 npm版本,一旦对npm v6的支持不再相关.
  • .

这就是为什么他们可以自动将锁文件从v1升级到v2,而不会破坏任何东西。

我今天遇到了同样的问题。我正在与一个拥有不同版本的npm (>7)的开发人员进行一个项目,我遇到了同样的问题。我只是把我的npm版本升级到上面提到的其他开发人员正在使用的最新版本。 以下是升级npm(适用于windows)的步骤

首先,通过从提升的PowerShell运行以下命令,确保您可以在系统上执行脚本。要运行PowerShell作为Administrator,单击Start,搜索PowerShell,右键单击PowerShell并选择Run as Administrator

接下来执行以下命令:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force

然后,要安装和使用此升级工具,运行以下命令(也是从提升的PowerShellcmd.exe)。注意:该工具至少需要Node v8

npm install --global --production npm-windows-upgrade
npm-windows-upgrade

只想安装最新版本?肯定的:

npm-windows-upgrade --npm-version latest

现在您可以从命令行中选择要安装的版本。

https://github.com/felixrieseberg/npm-windows-upgrade

上面的链接就是我使用过的工具。这个工具既适用于Linux又适用于Windows。我希望它能有所帮助。

npm WARN read-shrinkwrap这个版本的npm与lockfileVersion@1兼容,但是package-lock。json为lockfileVersion@2生成。我会尽力做到最好的!

为了解决此问题,可以使用该命令

npm i -g npm@latest

全局和运行命令

npm i npm@latest

在项目文件中帮我解决了这个问题。

尝试删除package-lock.json并再次运行npm install

有一个比使用nvm更简单的解决方案:

npx npm@6.14.17 i --save

有了这个,你可以用版本1生成一个新的锁文件,使用最新的node js版本,你不需要在你的机器上改变任何东西。

这就是docker被发明的原因!让你的项目在docker容器中运行,然后使用makefile命令来构建你的项目,或者类似的东西

.PHONY: up
up:
$(MAKE) down
docker-compose up -d
$(MAKE) logs

使用一个合成文件来设置你的项目,然后依赖make <insert command>来运行/构建你的项目。一个命令可以是make shell来进入一个shell环境,在这个环境中所有的开发者都有相同的npm / node版本。npm i -g npm@latest不是一个答案,因为它只是将npm安装在它运行的任何地方,所以新的开发人员仍然必须运行该命令,除非它是构建的一部分。

锁文件的构造取决于NPM版本,v7+将创建锁文件2,下面将创建锁文件v1。Lockfile v2是向后兼容的,所以人们运行npm <V6将可以使用它,但我在我的第二个屏幕上看到一个圆形构建失败,这表明我们使用的一些NPM包与lockfile v2不兼容…例如,旧的NPM包可能不能很好地维护和兼容新的锁文件。

因此,最好的办法可能是把你的环境隔离起来。

从版本8.1.0开始,在npm中有一个标记--lockfile-version,你可以用它来覆盖默认的锁文件版本:

npm i --lockfile-version 3

这是原始PR的链接