有没有一种方法来确认package-lock.json实际上解决了package.json中的所有依赖关系?

我们希望向CI服务器添加一个自动检查,以防止代码被提交,从而更新package.json的依赖项,但不更新package-lock.json已parsing的依赖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文件反映一组有效的依赖关系解决scheme。

运行npm ls似乎是为你做的,因为它会抛出package.json和它的锁之间的差异。 在节点脚本中,可以使用节点的child_process.exec.execSync执行此操作。 如果您想包含有用的消息,asynchronous似乎更清晰:

 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之前在你的configuration文件中的某个地方运行npm ls