我们希望向 CI 服务器添加自动检查,以防止提交更新
package.json
中的依赖项但不更新 package-lock.json
中已解析的依赖项的代码。
例如,如果有人手动更新了
package.json
中的依赖项,但运行 npm install
而不是 npm update
(npm 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
文件的一组有效的依赖关系解析。
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 =)");
});
或者为了简单起见,您可以在 CI 中的某个时刻在
npm ls
之前运行 npm install
。
...
或者为了简单起见,您可以在 npm install 之前在 CI 中的某个时刻运行 npm ls 。
它不包括没有node_modules时初始npm安装的情况(在CI服务器的情况下可能每次都会这样)
使用自 5.7.x 版本起可用的 npm ci (https://docs.npmjs.com/cli/ci)。
npm 错误!仅当您的 package.json 和 package-lock.json 或 npm-shrinkwrap.json 同步时,cipm 才能安装软件包。请先使用“npm install”更新您的锁定文件,然后再继续。 npm 错误! npm 错误! npm 错误!无效:锁定文件的 [电子邮件受保护] 不满足 core-js@^3.0.0-alpha.4
使用
npm ci
命令。它会检查以确保 package.json
和 package-lock.json
始终同步。
如果它们不同步,您会收到类似以下内容的错误
npm ERR!
npm ERR! Invalid: lock file's [email protected] does not satisfy yuglify@^2.0.1
从这个 stackoverflow 答案我找到了我现在正在使用的解决方案,这是一个执行此检查的小包。
我特别想检查 npm install 是否根本不会更改我的包锁定,因为我总是在更新包版本后忘记运行 npm install 之类的事情,所以 package-lock-utd 是正确的解决方案对我来说。