检查package.json的dependencies部分中是否有任何范围版本的命令

时间:2018-12-24 15:09:45

标签: npm package.json semantic-versioning

基本上,如果package.json的依赖项部分包含任何范围运算符,我都希望CI失败。 devDependencies可以包含任何思想。某些CLI命令将是完美的。有什么建议么?

1 个答案:

答案 0 :(得分:2)

简短答案:不幸的是,尚无内置的npm命令/功能可以实现此目的。但是,您可以利用自己的自定义nodejs脚本。如果您在 package.json scripts部分中定义了nodejs脚本,则可以通过命令来调用它。

下面介绍了如何实现此目标。


解决方案

  1. check-deps.js

    创建如下的nodejs脚本。让我们将脚本命名为check-deps.js并将其保存在项目目录中的某个位置。

    const isSemverRange = require('is-semver-range');
    
    const pkgPath = './path/to/your/package.json';
    const pkgData = require(pkgPath);
    
    function hasSemverRange({ dependencies = {}}) {
      return Object.values(dependencies).some(semver => isSemverRange(semver));
    }
    
    if (hasSemverRange(pkgData)) {
      console.log(`Semver range(s) found in dependencies section of ${pkgPath}`);
      process.exit(1);
    }
    

    check-deps.js的解释:

    • 首先,我们require is-semver-range软件包将用于帮助检查是否有任何semver ranges。要安装此软件包; cd到您的项目目录并运行以下命令:

      npm i -D is-semver-range
      
    • 然后我们定义 package.json 文件(即我们要检查的文件)的路径,然后require其内容。

      const pkgPath = './path/to/your/package.json'; // <-- Redefine path.
      const pkgData = require(pkgPath);
      

      注意:您需要根据需要重新定义 package.json 的路径。

    • hasSemverRange函数参数定义利用object destructuring来解包dependencies对象,并为default value分配一个空对象,以避免在{ package.json 中缺少{1}}部分。

      在函数体中,我们将dependencies对象传递给Object.values方法,并利用Array.some()方法来测试值中的至少一个是否是一个semver范围。 / p>

      如果dependencies对象的任何属性/键的值在一个semver范围内,则此函数返回true,否则返回dependencies

    • 最后,在false语句条件下,我们调用if函数,将在 package.json 上解析的内容传递给该函数。如果条件是 truthy ,我们会将错误消息记录到控制台,然后使用非零退出代码(即hasSemverRange)退出脚本。

  2. package.json

    package.json process.exit(1)部分中,定义脚本,如下所示。让我们将脚本命名为scripts

    check-deps

    注意:您需要根据需要重新定义 check-deps.js 的路径。

  3. 运行npm脚本

    通过CLI运行以下命令以调用"scripts": { "check-deps": "node path/to/check-deps.js", ... } 脚本:

    check-deps

    如果 package.json npm run check-deps 部分中定义的任何属性的值都是一个semver范围,您将在控制台上看到类似以下错误的记录:

      

    dependencies

  4. 将支票与CI工具集成。

    不清楚您使用的是哪个CI工具。但是,通常CI工具提供了允许您调用npm脚本的功能。

    例如,如果您利用Travis CI,则可以定义脚本以在 .travis.yml 文件中运行,如下所示:

    .travis.yml

    Semver range(s) found in dependencies section of ./path/to/package.json
  5. 附加说明:

    您还可以通过现有的script: - npm check-deps 脚本来调用npm check-deps脚本,该脚本可能已经通过使用test package.json 中定义了。操作员。例如:

    &&

    注意:在"scripts": { "check-deps": "node path/to/check-deps.js", "test": "yourCurrentTestcommands && npm run check-deps" ... } 部分上方的test脚本中,应替换为您当前可能正在运行的任何命令。