我也不知道在 shell 中循环的平台无关方式。
但是,根据您的示例,使用jshint在多个文件上运行单个npm-script的平台无关解决方案是:
- 利用cli-glob查找
.js
文件。
- 将结果/路径从 globbing 模式传输到自定义实用程序节点脚本。
- 然后在节点脚本中:
stdin
使用节点readline
模块读取通过管道传输的路径。
- 创建
Array
每个路径的一个,然后将其转换为String
.
- 使用节点模块运行
jshint
可执行文件(包括String
所有路径) 。child_process.exec()
虽然这个解决方案不是特别“简单”,但以下要点展示了这个过程:
npm脚本
"scripts": {
"jshint": "glob \"src/js/**/*.js\" | node .scripts/jshint.js"
},
注意 cli-glob(添加到 package.json)获取路径并将它们通过管道传递给jshint.js。
jshint.js
#!/usr/bin/env node
'use strict';
var path = require('path');
var readline = require('readline');
var exec = require('child_process').exec;
var rl = readline.createInterface({
input: process.stdin,
output: null,
terminal: false
});
// Normalise path to local jshint executable.
var jshintExec = ['.', 'node_modules', '.bin', 'jshint '].join(path.sep);
var paths = [];
function jshint(paths) {
var command = [jshintExec, paths].join('');
exec(command, function(error, stdout, stderr) {
if (stdout) {
console.log(stdout);
}
if (stderr) {
console.log(stderr);
}
});
}
rl.on('line', function(srcPath) {
paths.push(srcPath);
});
rl.on('close', function() {
jshint(paths.join(' '));
});
笔记
第 16 行阅读:
var jshintExec = ['.', 'node_modules', '.bin', 'jshint '].join(path.sep);
该脚本假定jshint
已在本地安装并添加"devDependencies": {}
到package.json
. 即它指向在文件夹jhint
中找到的本地可执行node_modules/.bin
文件,而不是全局安装的。
如果您的偏好是运行全局安装,jshint
则将第 16 行更改为:
var jshintExec = 'jshint ';
就个人而言,在本地安装它是这种情况下的首选恕我直言!
多种通配模式
您提供的示例包括多个 glob 模式。
"lint": "jshint *.js **/*.js"
cli-glob的一个限制是它不接受多个 glob 模式。所以一种解决方法是做这样的事情:
"scripts": {
"jshint": "npm run jshint-a && npm run jshint-b",
"jshint-a": "glob \"*.js\" | node .scripts/jshint.js",
"jshint-b": "glob \"**/*.js\" | node .scripts/jshint.js"
},
是的,不是特别简洁 - 但有效!