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

新手上路,请多包涵

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

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.5k
2 个回答

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

我会建议你固定 Node/NPM 版本,并在你的环境(开发、登台和生产)中调整它。

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

例如, .nvmrc 看起来像:

 $ cat .nvmrc
14.15.0

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

NPM 还支持 engines

您可以指定您的东西适用的节点版本:

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

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

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

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

{ "engines" : { "npm" : "~1.0.20" } }

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

When utilizing the engines field and make npm fail when the version constraints are unmet, set engine-strict=true (since it is false by default )在 .npmrc 文件 中或作为 npm_config_engine_strict=true 环境变量

如果设置为 true,那么 npm 将顽固地拒绝安装(甚至考虑安装)任何声称与当前 Node.js 版本不兼容的包。

这可以通过设置 –force 标志来覆盖。

另一种方法是使用 Docker 容器 作为开发和执行的运行时环境,这意味着您既不需要安装 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 来简化工作流程。

原文由 Mr. 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

要解决此问题,请运行命令

npm i -g npm@latest

全局并运行命令

npm i npm@latest

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

原文由 S J BHAVANA 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题