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

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

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

有没有办法指定新版本的npm只使用"lockfileVersion": 1?还是说我们必须让所有的开发者使用同一个版本的npm?


有没有办法指定新版本的npm只使用"lockfileVersion": 1?还是说我们必须让所有的开发者使用同一个版本的npm?

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

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

例如,.nvmrc看起来像:

$ cat .nvmrc
14.15.0

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

NPM也支持引擎:

You can specify the version of node that your stuff works on: { "engines" : { "node" : ">=0.10.3 <0.12" } } And, like with dependencies, if you don't specify the version (or if you specify "*" as the version), then any version of Node will do. If you specify an "engines" field, then npm will require that "node" be somewhere on that list. If "engines" is omitted, then npm will just assume that it works on Node. You can also use the "engines" field to specify which versions of npm are capable of properly installing your program. For example: { "engines" : { "npm" : "~1.0.20" } } Unless the user has set the engine-strict config flag, this field is advisory only and will only produce warnings when your package is installed as a dependency.

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

如果设置为true,那么npm将顽固地拒绝安装(甚至考虑安装)任何声称与当前Node.js版本不兼容的包。 这可以通过设置——force标志来覆盖。

另一种方法是使用Docker容器作为开发和执行的运行时环境,这意味着你既不需要安装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:

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

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


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

在npm 7发布说明中,他们说:

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

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

lockfileVersion An integer version, starting at 1 with the version number of this document whose semantics were used when generating this package-lock.json. Note that the file format changed significantly in npm v7 to track information that would have otherwise required looking in node_modules or the npm registry. Lockfiles generated by npm v7 will contain lockfileVersion: 2. No version provided: an "ancient" shrinkwrap file from a version of npm prior to npm v5. 1: The lockfile version used by npm v5 and v6. 2: The lockfile version used by npm v7, which is backwards compatible to v1 lockfiles. 3: The lockfile version used by npm v7, without backwards compatibility affordances. This is used for the hidden lockfile at node_modules/.package-lock.json, and will likely be used in a future version of npm, once support for npm v6 is no longer relevant.

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


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

首先,通过从升级的PowerShell运行以下命令,确保您可以在系统上执行脚本。以管理员身份运行PowerShell,单击“开始”,搜索“PowerShell”,右键单击“PowerShell”,选择“以管理员身份运行”。

接下来执行以下命令:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force

然后,要安装和使用这个升级工具,运行以下命令(也是从升级的PowerShell或cmd.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

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


尝试移除包锁。然后再次运行NPM install。


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

npx npm@6.14.17 i --save

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


锁文件的构造取决于NPM版本。V7 +将创建锁文件2,下面将创建锁文件v1。

Lockfile v2是向后兼容的,所以运行npm < v6的人可以使用它,但我在我的第二个屏幕上看到一个圆形构建失败,这表明我们使用的一些npm包与Lockfile v2不兼容…例如,旧的NPM包可能不能很好地维护和兼容lockfile v2。

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

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

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

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


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

npm i --lockfile-version 3

这是原始PR的链接。