テストを実行してコードをリントするために、小さなプロジェクトでGulpを使用しています。これらのタスクのいずれかが失敗すると、Gulpは常にリターンコード0で終了します。jshintを手動で実行すると、ゼロ以外のコードで終了するはずです。
どういうわけか、Gulpに意味のある値を返すように明示的に指示する必要がありますか?これはGulpのせいですか、それともgulp-jshintとgulp-jasmineプラグインが原因でしょうか?
this commit で修正が導入されました。
次のように機能します。
gulp.src("src/**/*.js")
.pipe(jshint())
.pipe(jshint.reporter("default"))
.pipe(jshint.reporter("fail"));
私はcircleciでそれを使用してきましたが、うまくいきます!
タスクが返されたストリームを待つように、「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'));
});
ボーナスは、タスクに費やした実際の時間を測定できることです。
@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)
})
})
gulp-jshintは、jshintの失敗でビルドを失敗させる方法に苦労しています。一方では、jshint内のビルドをクラッシュさせることができますが、その後はレポーターに到達することはありません。一方、レポーターにビルドの失敗を要求することは、デフォルトのレポーターの一部ではありません。私は通常、失敗を追跡する独自のレポーターを接続し、.on('end', function () {
はprocess.exit(1)
を使用します。それはかなり強引ですが、それは魅力のように機能します。 https://github.com/wearefractal/gulp-jshint/issues/1 を参照してください
上記の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)
});
gulp.task('default', function(done) {
return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});
私のために働く