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

时间:2017-07-24 18:17:01

标签: node.js npm package.json

我们希望向CI服务器添加一个自动检查,以防止代码被提交,以更新package.json中的依赖项,但不会更新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文件的有效依赖项解析集。

3 个答案:

答案 0 :(得分:2)

正在运行npm ls似乎是为您执行此操作,因为它会因package.json及其lock之间的差异而引发错误。在节点脚本中,您可以使用节点child_process.execpostgres=# create database db1; create database db2; CREATE DATABASE CREATE DATABASE postgres=# revoke connect on database db1, db2 from public; REVOKE postgres=# create role foo with login password 'bar' nocreatedb nocreaterole; CREATE ROLE postgres=# set role foo; SET postgres=> create role win with login password 'amp' nocreatedb nocreaterole; ERROR: permission denied to create role postgres=> set role nd; SET postgres=# grant usage on schema nd to foo; GRANT postgres=# grant execute on function nd.fn_create_role(text, text, text[]) to foo; GRANT postgres=# set role foo; SET postgres=> select nd.fn_create_role('win', 'amp', '{db1}'); ┌────────────────┐ │ fn_create_role │ ╞════════════════╡ │ │ └────────────────┘ (1 row) 执行此操作。如果您想要包含有用的消息,Async似乎更清晰:

.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

答案 1 :(得分:2)

  

...

     

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

如果没有node_modules(每次CI服务器可能都是这种情况),则不包括初始npm安装的情况

使用从5.7.x版本开始可用的npm ci(https://docs.npmjs.com/cli/ci)。

npm ERR! cipm can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock file with `npm install` before continuing.
npm ERR! 
npm ERR! 
npm ERR! Invalid: lock file's core-js@2.5.7 does not satisfy core-js@^3.0.0-alpha.4

答案 2 :(得分:0)

使用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