有没有办法确认package-lock.json实际上解析了package.json中的所有依赖项?

And*_*ler 8 node.js npm package.json

我们希望向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"
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

后:

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

// package-lock.json (not changed)
{
    "dependencies": {
       "lodash": {
           "version": "3.1.3"
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在package-lock.json不再反映文件的有效依赖项解析集package.json.

rya*_*nve 6

Runningnpm 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 =)");
});
Run Code Online (Sandbox Code Playgroud)

或者为了简单起见,您可以npm lsnpm install.


Eug*_*nya 6

...

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

当没有 node_modules 时,它不包括初始 npm install 的情况(在 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@2.5.7 不满足 core-js@^3.0.0-alpha.4


小智 5

使用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
Run Code Online (Sandbox Code Playgroud)