如果两个不同的开发人员在最初使用包锁创建的项目中使用不同版本的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 install。

其他回答

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

npm i --lockfile-version 3

这是原始PR的链接。

据我所知,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,而不会破坏任何东西。

有一个比使用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安装在它运行的任何地方,所以新的开发人员仍然必须运行这个命令,除非它是构建的一部分。

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