2016-09-23 47 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

相關問題