web-dev-qa-db-ja.com

Gulpはタスクが失敗すると0を返します

テストを実行してコードをリントするために、小さなプロジェクトでGulpを使用しています。これらのタスクのいずれかが失敗すると、Gulpは常にリターンコード0で終了します。jshintを手動で実行すると、ゼロ以外のコードで終了するはずです。

これは私の非常に単純なgulpfileです

どういうわけか、Gulpに意味のある値を返すように明示的に指示する必要がありますか?これはGulpのせいですか、それともgulp-jshintとgulp-jasmineプラグインが原因でしょうか?

34

this commit で修正が導入されました。

次のように機能します。

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

私はcircleciでそれを使用してきましたが、うまくいきます!

9
Rimian

タスクが返されたストリームを待つように、「gulp.src(...」を返す必要があります。

[〜#〜] edit [〜#〜]

Gulpタスクは本質的に非同期です。実際のタスクは、「gulp.src(...)。pipe(...);」の時点ではまだ実行されていません。あなたの例では、実際のタスクが実行される前に、gulpタスクは結果を成功としてマークします。

Gulpが実際のタスクを待つようにする方法はいくつかあります。コールバックを使用するか、ストリームまたはプロミスを返します。

https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support

最も簡単な方法は、「gulp.src(...)。pipe(...)」のストリームを返すことです。 gulpタスクがストリームを取得すると、「end」イベントと「error」イベントをリッスンします。これらは戻りコード0および1に対応します。したがって、「lint」タスクの完全な例は次のようになります。

gulp.task('lint', function () {
    return gulp.src('./*.js')
               .pipe(jshint('jshintrc.json'))
               .pipe(jshint.reporter('jshint-stylish'));
});

ボーナスは、タスクに費やした実際の時間を測定できることです。

12
Shuhei Kagawa

@robrichは正しいです。終了コードを自分で追跡する必要がありますが、強制的なアプローチは必要ありません。 processグローバルは、exit関数をバインドできる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)
  })
})
10
Alec Wenzowski

gulp-jshintは、jshintの失敗でビルドを失敗させる方法に苦労しています。一方では、jshint内のビルドをクラッシュさせることができますが、その後はレポーターに到達することはありません。一方、レポーターにビルドの失敗を要求することは、デフォルトのレポーターの一部ではありません。私は通常、失敗を追跡する独自のレポーターを接続し、.on('end', function () {process.exit(1)を使用します。それはかなり強引ですが、それは魅力のように機能します。 https://github.com/wearefractal/gulp-jshint/issues/1 を参照してください

4
robrich

上記のAndy Piperの回答と同様に、エラーが発生した場合にコードを確実に発行して終了するタスクのシーケンスを実行するときに、このモジュール 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)
});
2
alfonsob
gulp.task('default', function(done) {
  return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});

私のために働く

0
Andy Piper