2016-09-23 20 views
1

我有一个Gulp任务,在将它们注入到HTML页面之前先对Javascript文件进行处理。如果发现linting错误,我希望文件不被注入。因此,如果第一个任务中出现错误,请取消所有后续任务。如何暂停一系列任务,但继续在Gulp中观看文件?

需要注意的是,这个任务是由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']); 
}); 

回答

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执行。

接下来,您需要在提供给您的runSequence任务watch:jscallback,否则吞掉当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(); 
    }); 
}); 
+0

这是有效的 - 谢谢你斯文。 – Ash

相关问题