有没有办法在不运行
package-lock.json
的情况下检查 package.json
文件是否与 npm install
兼容? 兼容意味着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 install
。 npm ci
仅引用package-lock.json
,因此如果开发人员不更新锁定文件,持续集成设置将不会符合他们的预期。
正如评论中有人提到的,有
npm ci
命令,如果 package.json
与 package-lock.json
不同步,它将抛出错误。
这是我用来“测试”它们是否平等的方法:
ERRORS=0
npm ci
if [[ "$?" -ne 0 ]]; then
echo "Dependency installation failed!"
ERRORS=$(($ERRORS+1))
fi
我正在寻找一种更好的方法来执行此操作,因为这实际上会删除整个
node_modules
目录,确认奇偶校验,然后在一切正常的情况下继续安装锁定版本,但这需要一些时间,具体取决于软件包的数量.
我花了几个月的时间才发现
npm ci
不是你的朋友,因为它会错过从package.json同步更新的引擎into
package-lock.json. Thus I think that the answer is
npm install --生产`
所有的荣誉都应该去https://stackoverflow.com/a/19824154/99834,它详细解释了它。为了方便起见,我将提及最重要的部分:
npm install
将安装/更新 devDependency,除非添加 --production
标志npm update
将忽略 devDependency,除非添加 --dev
标志跑步
npm ci --dry-run --ignore-scripts
是一种快速、简单的方法来检查
package-lock.json
和 package.json
文件是否同步,而无需实际安装任何依赖项。 (如果您没有任何安装后脚本,则可以省略--ignore-scripts
)
在 CI 环境中,一个很好的用例是当您使用
node_modules
的校验和作为缓存键来恢复缓存的 package-lock.json
文件夹时。 (请参阅 https://circleci.com/docs/caching/ 了解如何完成此操作的一个示例)
恢复缓存后执行
npm ci --dry-run
只需要几秒钟,如果更新了package.json
依赖项但开发者未能将相应更改提交到package-lock.json
,则会导致 PR 作业失败