Ответ 1
Он работает примерно так:
gulp.src("src/**/*.js")
.pipe(jshint())
.pipe(jshint.reporter("default"))
.pipe(jshint.reporter("fail"));
Я использую его на круге, и он работает!
Я использую Gulp в своем маленьком проекте, чтобы запускать тесты и использовать мой код. Когда любая из этих задач выходит из строя, Gulp всегда выходит с кодом возврата 0. Если я запускаю jshint вручную, он выходит с ненулевым кодом, как и должно быть.
Вот мой очень простой gulpfile.
Нужно ли мне как-то явно сообщать Gulp о возвращении значимого значения? Это ошибка Gulp или, возможно, виноваты плагины gulp -jshint и gulp -jasmine?
Он работает примерно так:
gulp.src("src/**/*.js")
.pipe(jshint())
.pipe(jshint.reporter("default"))
.pipe(jshint.reporter("fail"));
Я использую его на круге, и он работает!
Вам нужно "вернуть gulp.src(...", чтобы задача ожидала возвращенный поток.
ИЗМЕНИТЬ
Gulp задачи носят асинхронный характер. Фактическая задача еще не выполняется во время "gulp.src(...). Pipe (...); '. В вашем примере задачи gulp отмечают свои результаты как успешные до выполнения реальных задач.
Есть несколько способов сделать gulp ждать вашей реальной задачи. Используйте обратный вызов или возвращайте поток или обещайте.
https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support
Самый простой способ - просто вернуть поток 'gulp.src(...). pipe (...)'. Если задача gulp получает поток, он будет прослушивать событие "конец" и событие "ошибка". Они соответствуют обратному коду 0 и 1. Таким образом, полным примером вашей задачи "lint" будет:
gulp.task('lint', function () {
return gulp.src('./*.js')
.pipe(jshint('jshintrc.json'))
.pipe(jshint.reporter('jshint-stylish'));
});
Бонус в том, что теперь вы можете измерить фактическое время, потраченное на ваши задачи.
@robrich прав, вы должны сами отслеживать коды выхода, но нет необходимости в сильном подходе. process
global - это EventEmitter
, к которому вы можете привязать свою функцию выхода.
var exitCode = 0
gulp.task('test', function (done) {
return require('child_process')
.spawn('npm', ['test'], {stdio: 'pipe'})
.on('close', function (code, signal) {
if (code) exitCode = code
done()
})
})
gulp.on('err', function (err) {
process.emit('exit') // or throw err
})
process.on('exit', function () {
process.nextTick(function () {
process.exit(exitCode)
})
})
gulp -jshint борется с тем, как сбой сборки jshint. С одной стороны, мы можем разрушить сборку внутри jshint, но тогда вы никогда не дойдете до репортера. С другой стороны, требуя, чтобы репортер потерпел неудачу, сборка не является частью репортеров по умолчанию. Обычно я подключаю своего репортера, который отслеживает ошибку, и .on('end', function () {
будет process.exit(1)
. Это довольно грубая сила, но она работает как шарм. См. https://github.com/wearefractal/gulp-jshint/issues/10
Как и в случае с Энди Пайпером, я нашел этот модуль stream-combiner2, чтобы быть полезным при выполнении последовательности задач для обеспечения и выхода код испускается, если есть ошибка где-то. Можно использовать что-то вроде этого
var combiner = require('stream-combiner2');
var tasks = combiner.obj([
gulp.src(files),
task1(options),
task2(options),
gulp.dest('path/to/dest')
]);
tasks.on('error', function () {
process.exit(1)
});
gulp.task('default', function(done) {
return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});
Работает для меня