基本上,如果package.json的依赖项部分包含任何范围运算符,我都希望CI失败。 devDependencies可以包含任何思想。某些CLI命令将是完美的。有什么建议么?
答案 0 :(得分:2)
简短答案:不幸的是,尚无内置的npm命令/功能可以实现此目的。但是,您可以利用自己的自定义nodejs脚本。如果您在 package.json 的scripts
部分中定义了nodejs脚本,则可以通过命令来调用它。
下面介绍了如何实现此目标。
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
)退出脚本。
package.json
在 package.json 的process.exit(1)
部分中,定义脚本,如下所示。让我们将脚本命名为scripts
:
check-deps
注意:您需要根据需要重新定义 check-deps.js 的路径。
运行npm脚本
通过CLI运行以下命令以调用"scripts": {
"check-deps": "node path/to/check-deps.js",
...
}
脚本:
check-deps
如果 package.json 的npm run check-deps
部分中定义的任何属性的值都是一个semver范围,您将在控制台上看到类似以下错误的记录:>
dependencies
将支票与CI工具集成。
不清楚您使用的是哪个CI工具。但是,通常CI工具提供了允许您调用npm脚本的功能。
例如,如果您利用Travis CI,则可以定义脚本以在 .travis.yml 文件中运行,如下所示:
.travis.yml
Semver range(s) found in dependencies section of ./path/to/package.json
附加说明:
您还可以通过现有的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
脚本中,应替换为您当前可能正在运行的任何命令。