我有一个Gulp
任务,在将Javascript文件注入HTML页面之前会对其进行删除。如果发现linting错误,我希望不要注入文件。因此,如果第一个任务中出现错误,请取消所有后续任务。
需要注意的是,此任务由gulp.watch
运行,我希望手表能够继续监控文件并在解决掉掉错误时注入它们。
这可能在gulp
吗?插件是可以接受的。
Gulpfile
:
var gulp = require('gulp');
var runSequence = require('run-sequence');
//(plugin declarations removed for brevity)
gulp.task('eslint', function() {
return gulp.src(config.lint)
.pipe($.cached('eslint'))
.pipe($.eslint())
.on('error', $.gutil.log)
.pipe($.eslint.format());
});
gulp.task('inject:resources', function() {
return gulp.src(config.src.templates)
.pipe(
$.inject(gulp.src(config.dist.scripts + '/all*.js',
{read: false}),
{
ignorePath: config.dist.public,
addRootSlash: false,
name: 'scripts'
}
))
.pipe(gulp.dest(config.dist.public));
});
gulp.task('watch:js', function(callback) {
runSequence('eslint', 'inject:resources');
});
gulp.task('watch', function() {
gulp.watch(config.src.scripts, ['watch:js']);
});
答案 0 :(得分:1)
首先,当您的任何文件产生错误时,您需要使eslint
失败。您可以将eslint.failAfterError()
放在流的末尾来执行此操作:
gulp.task('eslint', function() {
return gulp.src(config.lint)
.pipe($.cached('eslint'))
.pipe($.eslint())
.on('error', $.gutil.log)
.pipe($.eslint.format())
.pipe($.eslint.failAfterError());
});
当eslint
任务失败时,inject:resources
将不会执行后续runSequence
任务。
接下来,您需要将callback
任务中的watch:js
提供给runSequence
,否则gulp将在watch:js
完成后不会注意到(并且因为您不能与自身并行运行相同的任务,这将有效防止再次启动watch:js
:
gulp.task('watch:js', function(callback) {
runSequence('eslint', 'inject:resources', callback);
});
唯一的缺点是上面会产生一个丑陋的堆栈跟踪,并没有真正提供任何有用的附加信息。如果你想防止你只是“吞下”正在传递回调链的错误,如下所示:
gulp.task('watch:js', function(callback) {
runSequence('eslint', 'inject:resources', function(err) {
callback();
});
});