【问题标题】: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

【问题讨论】:

    标签: node.js npm package-lock.json


    【解决方案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:

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

    由于上面的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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-30
        • 2018-03-21
        • 2021-12-27
        • 2018-08-14
        • 2021-05-14
        • 2019-07-23
        • 2017-12-14
        相关资源
        最近更新 更多