有啥方法可以修复 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
然后,要安装和使用此升级工具,请运行以下命令(也来自提升的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。我希望它会有所帮助。
【讨论】:
【参考方案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 使用特定格式?的主要内容,如果未能解决你的问题,请参考以下文章