Подтвердить что ты не робот

Gulp возвращает 0 при неудачных задачах

Я использую Gulp в своем маленьком проекте, чтобы запускать тесты и использовать мой код. Когда любая из этих задач выходит из строя, Gulp всегда выходит с кодом возврата 0. Если я запускаю jshint вручную, он выходит с ненулевым кодом, как и должно быть.

Вот мой очень простой gulpfile.

Нужно ли мне как-то явно сообщать Gulp о возвращении значимого значения? Это ошибка Gulp или, возможно, виноваты плагины gulp -jshint и gulp -jasmine?

4b9b3361

Ответ 1

В зафиксировано исправление.

Он работает примерно так:

gulp.src("src/**/*.js")
  .pipe(jshint())
  .pipe(jshint.reporter("default"))
  .pipe(jshint.reporter("fail"));

Я использую его на круге, и он работает!

Ответ 2

Вам нужно "вернуть 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'));
});

Бонус в том, что теперь вы можете измерить фактическое время, потраченное на ваши задачи.

Ответ 3

@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)
  })
})

Ответ 4

gulp -jshint борется с тем, как сбой сборки jshint. С одной стороны, мы можем разрушить сборку внутри jshint, но тогда вы никогда не дойдете до репортера. С другой стороны, требуя, чтобы репортер потерпел неудачу, сборка не является частью репортеров по умолчанию. Обычно я подключаю своего репортера, который отслеживает ошибку, и .on('end', function () { будет process.exit(1). Это довольно грубая сила, но она работает как шарм. См. https://github.com/wearefractal/gulp-jshint/issues/10

Ответ 5

Как и в случае с Энди Пайпером, я нашел этот модуль 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)
});

Ответ 6

gulp.task('default', function(done) {
  return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});

Работает для меня