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

Posted

技术标签:

【中文标题】有啥方法可以修复 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 以便 npm 使用特定格式? 【发布时间】:2021-02-25 00:57:40 【问题描述】:

如果两个不同的开发人员在最初使用package-lock.json"lockfileVersion": 1 创建的项目中使用不同版本的 node (12/15) 和 npm (6/7),则当使用 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

【问题讨论】:

【参考方案1】:

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

我会建议您固定 Node/NPM 版本并将其与您的环境(开发、登台和生产)保持一致。

您可以通过将.nvmrc 文件添加到项目中来利用nvm 管理节点版本(不要忘记将其存储在您的源代码管理中)。

例如,.nvmrc 看起来像:

$ cat .nvmrc
14.15.0

那么,您可以使用nvm install && nvm use 来使用固定版本的Node。

NPM 也支持engines:

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

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

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

如果您指定“引擎”字段,则 npm 将要求“节点”位于该列表中的某个位置。如果省略了“engines”,那么 npm 将假设它在 Node 上工作。

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

"engines" : "npm" : "~1.0.20"

除非用户设置了 engine-strict 配置标志,否则该字段仅是建议​​性的,并且只会在您的包作为依赖项安装时产生警告。

另一种方法是使用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:

    为新项目创建了一个新目录 启动一个 Node Docker 容器,它带有 Node 和 NPM 创建了一个新项目 (npm init -y) 退出 Docker 容器 列出了容器被旋转的工作目录中的文件

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

【讨论】:

嘿,我希望避免另一个 .*rc 文件,但这可能是真正的答案和潜在问题的最佳整体解决方案。 @Ben:你可以避免使用另一个 rc 文件来支持 docker-compose 文件;)(我已经相应地更新了我的答案) 我喜欢 nvm ls 而不是 catting rc 文件。为您提供有关您拥有哪些版本以及正在运行哪个版本的更多信息。也更容易记住,因为大多数版本管理器都有类似的命令。 请注意,如果您使用 npm 并想升级 npm,最简单的是 nvm install-latest-npm【参考方案2】:

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

在npm 7 release notes他们说:

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

在npm docs 它说(我的重点):

lockfileVersion

一个整数版本,从 1 开始,版本号为 this 生成此文档时使用其语义的文档 包锁.json。

请注意,文件格式在 npm v7 中发生了显着变化以跟踪 否则需要在 node_modules 中查看的信息 或 npm 注册表。 npm v7 生成的锁文件将包含 锁定文件版本:2。

未提供版本:来自 npm v5 之前版本的“古老”收缩包装文件。 1:npm v5 和 v6 使用的 lockfile 版本。 2:npm v7使用的lockfile版本,向后兼容v1 lockfiles。 3:npm v7 使用的 lockfile 版本,没有向后兼容功能。这用于隐藏的锁定文件 node_modules/.package-lock.json 和 将来可能会使用 npm 版本,一旦对 npm v6 的支持不再相关

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

【讨论】:

我们看到的是,任何仍然拥有 npm 6 并在项目中运行“npm install”的人最终都会将 package-lock 设置回 lockfileversion 1。在我们将其更新为之后非常烦人2 和 npm 7。将不得不尝试其中一个解决方案,或者让一群开发人员及时更新他们的机器......哈哈。【参考方案3】:

我今天遇到了同样的问题。我正在与具有不同版本的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。我希望它会有所帮助。

【讨论】:

【参考方案4】:

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

为了解决这个问题,运行命令

npm i -g npm@latest

全局并运行命令

npm i npm@latest

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

【讨论】:

你是在 linux 系统中做的吗?? 不,在 Windows 10 中 好的,谢谢,我刚刚重新启动我的操作系统,这项工作很好。 这个 npm i -g npm@latest 对我有用。谢谢【参考方案5】:

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

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

【讨论】:

以上是关于有啥方法可以修复 package-lock.json lockfileVersion 以便 npm 使用特定格式?的主要内容,如果未能解决你的问题,请参考以下文章

有啥办法可以在 Mac 上的 android studio 3.5.1 中修复这个错误

有啥方法可以在我的代码中注入 SQL 吗? [复制]

有啥方法可以在我的代码中注入 SQL 吗? [复制]

VUE配置项结构

zoom:1 有啥错误;在 CSS 中修复?

MDRoundFlatIconButton 在禁用后启用时会丢失背景颜色。有啥修复吗?