有没有办法修复 package-lock.json lockfileVersion 以便 npm 使用特定格式?

Is there any way to fix package-lock.json lockfileVersion so npm uses a specific format?

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

重新创建的

这似乎会给使用 npm v6 的开发人员带来问题,因为它尝试使用 lockfileVersion 2,但最终会产生新的差异。

npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!

有什么方法可以指定 npm 的较新版本为 使用 "lockfileVersion": 1?还是我们只需要让所有开发人员使用相同版本的 npm?

Is there any way to specify to newer versions of npm to only use "lockfileVersion": 1? Or do we just have to get all devs on the same version of npm?

我会建议您固定 Node/NPM 版本并使其在您的环境(开发、暂存和生产)中保持一致。

您可以利用 nvm for managing the node version by adding to your project .nvmrc 文件(不要忘记将其存储在源代码管理中)。

例如,.nvmrc 看起来像:

$ cat .nvmrc
14.15.0

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

NPM 还支持 engines:

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.

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

One change to take note of is the new lockfile format, which is backwards compatible with npm 6 users. The lockfile v2 unlocks the ability to do deterministic and reproducible builds to produce a package tree.

npm docs 它说(我强调):

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 中执行以下命令,确保您可以在系统上执行脚本。要运行PowerShellAdministrator,点击Start,搜索PowerShell,右击PowerShell和selectRun 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

现在您可以select从命令行安装您想要安装的版本。

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

以上link是我用过的工具。此工具适用于 Linux/Windows。希望对你有帮助。

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

为了克服这个问题,运行命令

npm i -g npm@latest

全局和运行命令

npm i npm@latest

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

试试这个: npm i -g npm@latest

如果这不能解决您的问题,请尝试重新启动您的电脑。