检查 NPM package.json 和 package-lock.json 是不是兼容

Posted

技术标签:

【中文标题】检查 NPM package.json 和 package-lock.json 是不是兼容【英文标题】:Check that NPM package.json and package-lock.json are compatible检查 NPM package.json 和 package-lock.json 是否兼容 【发布时间】:2020-01-19 18:20:02 【问题描述】:

有没有办法在不运行npm install 的情况下检查package-lock.json 文件是否与package.json 兼容?兼容意味着package.json指定的版本可以由package-lock.json实现。

当前方法

我目前正在通过运行 npm install 并检查 package-lock.json 是否更改如下:

git clone https://github.com/my/codebase
cd codebase
npm install
if [[ git diff-index --quiet HEAD -- package-lock.json ]]; then
  echo 'ERROR: npm install changed package-lock.json'
fi

用例

我想在持续集成中添加一个测试,以确保如果开发人员修改了package.json,他们也会相应地更新package-lock.json。这很重要的原因是我们的持续集成使用npm ci 而不是npm installnpm ci 只引用了package-lock.json,所以如果开发者不更新锁文件,持续集成的设置将不符合他们的预期。

【问题讨论】:

如果 package.json 和 package-lock.json 不同步,npm ci 将失败,因此您的持续集成已经在测试您的用例。您能否提供更多关于您发现的开发人员设置与 CI 设置之间差异的信息? 是的,我验证了这适用于版本号。但是,我发现在使用 Git 修订版时情况并非如此。复制和详细信息npm.community/t/… 【参考方案1】:

我花了几个月的时间才发现npm ci 不是你的朋友,因为它会错过从 package.jsonintopackage-lock.json. Thus I think that the answer is npm install --production` 同步更新的引擎。

所有的荣誉都应该去https://***.com/a/19824154/99834 详细解释它。为方便起见,我将提及最重要的部分:

npm install 将安装/更新 devDependencies,除非添加了 --production 标志 npm update 将忽略 devDependencies,除非添加了 --dev 标志

【讨论】:

【参考方案2】:

正如 cmets 中的某人所提到的,有 npm ci 命令,如果 package.jsonpackage-lock.json 不同步,它将引发错误。

这是我用来“测试”它们是否相等的方法:

ERRORS=0
npm ci
if [[ "$?" -ne 0 ]]; then
    echo "Dependency installation failed!"
    ERRORS=$(($ERRORS+1))
fi

我正在寻找一种更好的方法来执行此操作,因为这实际上会删除整个 node_modules 目录,确认奇偶校验,然后在一切正常的情况下继续安装锁定的版本,但这需要一些时间,具体取决于数量包。

【讨论】:

以上是关于检查 NPM package.json 和 package-lock.json 是不是兼容的主要内容,如果未能解决你的问题,请参考以下文章

为啥“npm install”会修改 package-lock.json?那为啥要把它提交给git呢?

npm怎么修改packagelock文件

如何使用 postinstall 编辑 package.json

NPM - 添加到 package.json 但不安装

利用npm 安装删除模块

NPM5,package-lock.json 和 package.json 有啥区别?