有没有办法修正package-lock.json的lockfileVersion,让npm使用特定的格式?

qnakjoqk  于 2022-11-14  发布在  其他
关注(0)|答案(8)|浏览(440)

如果两个不同的开发者在一个最初使用package-lock.json"lockfileVersion": 1创建的项目中使用不同版本的node(12/15)和npm(6/7),当使用npm 7 x的开发者安装新的包时,似乎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上获得所有的开发人员?

ljsrvy3e

ljsrvy3e1#

有没有办法指定npm的新版本只使用"lockfileVersion": 1?或者我们只需要在同一个npm版本上获得所有的开发人员?
我将建议您固定Node/NPM版本,并在您的环境(开发、登台和生产)中调整它。
您可以通过添加到项目.nvmrc文件(不要忘记将其存储在源代码控制中)来利用nvm管理节点版本。
例如,.nvmrc看起来如下所示:

$ cat .nvmrc
14.15.0

然后,您可以使用nvm install && nvm use来使用节点的固定版本。
NPM还支持engines
您可以指定您的素材所使用的节点版本:
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
而且,与依赖项一样,如果不指定版本(或者指定“*”作为版本),则任何版本的Node都可以。
如果指定了“engines”字段,npm将要求“node”位于该列表中的某个位置。如果省略了“engines”,npm将假定它在Node上工作。
您也可以使用“engines”字段来指定哪些版本的npm能够正确安装您的程序。例如:
{ "engines" : { "npm" : "~1.0.20" } }
除非用户设置了engine-strict config标志,否则此字段仅用于建议,并且仅在软件包作为相关项安装时才会生成警告.
当使用engines字段并在不满足版本约束时使npm失败时,请在.npmrc文件中设置engine-strict=true(因为默认情况下它是false)或将其设置为npm_config_engine_strict=true环境变量
如果设置为true,npm将顽固地拒绝安装(甚至考虑安装)任何声称与当前Node.js版本不兼容的包。
这可以通过设置--force标志来覆盖。
另一种方法是使用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.为新项目创建了新目录
1.启动一个Node Docker容器,它与Node和NPM一起提供
1.已创建新项目(npm init -y
1.已退出Docker容器
1.列出了工作目录中的文件,容器在其中旋转
由于上面的docker run命令很长,因此您可能希望利用docker-compose来实现更简化的工作流。

h79rfbju

h79rfbju2#

npm WARN read-shrinkwrap这个版本的npm与lockfileVersion@1兼容,但是package-lock.json是为lockfileVersion@2生成的。我会尽量使用它!
要解决此问题,请运行以下命令

npm i -g npm@latest

并运行命令

npm i npm@latest

帮助我解决了这个问题。

jobtbby3

jobtbby33#

据我所知,npm文档说,npm v6将与版本2锁定文件一起工作,尽管有警告,所以你不需要做任何事情建议在接受的答案,并可以安全地忽略警告消息。
npm 7 release notes中他们说:
需要注意的一个变化是新的lockfile格式,它向后兼容npm 6用户。lockfile v2解锁了进行确定性和可再现的构建以生成包树的能力。
npm docs中它说(我强调):

锁定文件版本

一个整数版本,从1开始,包含生成此包lock.json时使用其语义的文档的版本号。
请注意,文件格式在npm v7中发生了重大变化,以跟踪需要在node_modules或npm注册表中查找的信息。2.

  • 未提供版本:来自npmv 5之前的npm版本的“旧”包膜文件。
  • 1:npm v5和v6使用的锁定文件版本。
    *2:npm v7使用的锁定文件版本,向后兼容v1锁定文件。
  • 3:npm v7使用的锁定文件版本,没有向后兼容性启示。这用于node_modules/.package-lock.json中的隐藏锁定文件,并且在npm v6的支持不再相关时,可能会在npm的未来版本中使用。

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

qxsslcnc

qxsslcnc4#

我今天遇到了同样的问题。我正在和一个开发者一起做一个项目,他有一个不同版本的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的。我希望它能对你有所帮助。

2jcobegt

2jcobegt5#

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

npx npm@6.14.17 i --save

使用此命令,您可以使用版本1生成一个新的锁定文件,使用最新的node js版本,并且您不需要在您的机器上更改任何内容。

anauzrmj

anauzrmj6#

8.1.0版本起,npm中有一个标志--lockfile-version,您可以使用该标志覆盖默认的锁定文件版本:

npm i --lockfile-version 3

Here is the link to the original PR.

7vhp5slm

7vhp5slm7#

让你的项目在docker容器中运行,然后用一个makefile命令来构建你的项目,可能类似于

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

使用一个compose文件来设置你的项目,然后依靠make <insert command>来运行/构建你的项目。一个命令可以是make shell,进入一个shell环境,在那里你所有的开发人员都有相同的npm /节点版本。npm i -g npm@latest不是一个答案,因为它只是在运行npm的地方安装它,所以新的开发人员仍然必须运行该命令,除非它是构建的一部分。
锁定文件的构造取决于npm版本,v7+将创建锁定文件2,以下版本将创建锁定文件v1。锁定文件v2是向后兼容的,因此运行npm〈v6的用户可以使用它,但是我在我的第二个屏幕上看到了一个circleci构建失败,这表明我们使用的一些npm包与lockfile v2不兼容...即。旧的NPM包可能不能被很好地维护并且不能与新的锁定文件兼容。
因此,最好的做法可能是对接和隔离您的环境。

9fkzdhlc

9fkzdhlc8#

请尝试删除package-lock.json并再次运行npm install

相关问题