Я также не знаю о независимом от платформы способе цикла в оболочке.
Однако независимое от платформы решение для запуска одного npm-скрипта для нескольких файлов с помощью jshint в соответствии с вашим примером:
- Используйте cli-glob, чтобы найти
.js
файлы.
- По конвейеру результаты / пути из шаблона подстановки в сценарий настраиваемого служебного узла.
- Then within the node script:
- Read the paths piped to
stdin
using nodes readline
module.
- Создайте
Array
каждого пути и затем преобразуйте его в String
.
- Запустите исполняемый файл
jshint
(включая String
всех путей), используя узлы child_process.exec()
module .
Хотя это решение не особенно простое, следующие суть демонстрируют этот процесс:
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 ';
Лично для этого сценария предпочтительнее установить его локально!
Несколько шаблонов подстановки
Приведенный вами пример включает несколько шаблонов глобусов.
"lint": "jshint *.js **/*.js"
Одним из ограничений cli-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"
},
Да уж, не особо лаконично - но работает!
person
RobC
schedule
29.01.2017