【问题标题】:Is there a way to confirm a package-lock.json actually resolves all dependencies in a package.json?有没有办法确认 package-lock.json 实际上解决了 package.json 中的所有依赖项?
【发布时间】:2017-12-30 10:35:38
【问题描述】:

我们希望向 CI 服务器添加自动检查,以防止提交更新 package.json 中的依赖项但不更新 package-lock.json 中已解决的依赖项的代码。

例如,如果有人手动更新了 package.json 中的依赖项但运行 npm install 而不是 npm updatenpm install 支持 package-lock.json,如果存在),则可能会发生这种情况。或者即使有人在更新依赖项时运行了正确的npm 命令但随后忘记将结果更改提交给package-lock.json,也可能发生这种情况。我们尝试在代码审查中注意这些事情,但自动检查肯定会更好。有没有npm 命令可以做到这一点?

这里有一个例子来说明。

之前

// package.json
{
    "lodash": "~3.1.0"
}

// package-lock.json
{
    "dependencies": {
       "lodash": {
           "version": "3.1.3"
       }
    }
}

有人更新package.json,但忘记将更改提交给package-lock.json

之后:

// package.json
{
    "lodash": "~3.2.0"
}

// package-lock.json (not changed)
{
    "dependencies": {
       "lodash": {
           "version": "3.1.3"
       }
    }
}

现在package-lock.json 不再反映package.json 文件的一组有效依赖解决方案。

【问题讨论】:

    标签: node.js npm package.json


    【解决方案1】:

    使用npm ci 命令。它会检查以确保package.jsonpackage-lock.json 始终保持同步。

    如果它们不同步,您会收到类似于

    的错误
    npm ERR! 
    
    npm ERR! Invalid: lock file's yuglify@2.0.0 does not satisfy yuglify@^2.0.1
    

    【讨论】:

      【解决方案2】:

      ...

      或者为了简单起见,您可以在安装 npm 之前在 CI 中的某个位置运行 npm ls。

      当没有 node_modules 时,它不包括初始 npm install 的情况(CI 服务器可能每次都是这样)

      使用 npm ci (https://docs.npmjs.com/cli/ci) 从 5.7.x 版本开始可用。

      npm 错误! cipm 只能在您的 package.json 和 package-lock.json 或 npm-shrinkwrap.json 同步时安装包。请在继续之前使用 `npm install` 更新您的锁定文件。 npm 错误! npm 错误! npm 错误!无效:锁文件的 core-js@2.5.7 不满足 core-js@^3.0.0-alpha.4

      【讨论】:

        【解决方案3】:

        运行npm ls 似乎会为您执行此操作,因为它会因package.json 与其lock 之间的差异而引发错误。在节点脚本中,您可以使用节点的child_process.exec.execSync 执行此操作。如果您想包含有用的消息,异步似乎更干净:

        const cp = require("child_process");
        const verify = () => cp.exec("npm ls", error => {
          if (error) {
            console.error("Dependency mismatch between package.json and lock. Run: npm install");
            throw error;
          }
          console.log("Dependencies verified =)");
        });
        

        或者为了简单起见,您可以在 npm install 之前的某个时间点运行 npm ls

        【讨论】:

        • 如果您只关心顶层的差异,例如,如果您确定没有人会进入 node_modules 并手动更新内容,您可以使用npm ls --depth 0。这至少会削减一些输出,尽管我认为它仍然显示嵌套版本中的差异。此外,您可以使用--json 获得更多可解析的脚本输出。
        猜你喜欢
        • 1970-01-01
        • 2019-06-07
        • 1970-01-01
        • 2020-01-16
        • 2019-09-03
        • 2018-03-21
        • 1970-01-01
        • 2011-07-18
        • 2018-05-02
        相关资源
        最近更新 更多