我有一系列任务要从观察者处运行,但我可以按顺序启动它们:
这是gulp任务和观察者。
gulp.task('app_scss', function(){
return gulp.src(appScssDir + '/main.scss')
.pipe(sass({ style: 'compressed' }).on('error', gutil.log))
.pipe(autoprefix('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_vendor_css', function(){
return gulp.src(appProviderCssDir + '/*.css')
.pipe(minifyCSS({ keepSpecialComments: 0 }))
.pipe(concat('app_vendor.css'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_build_css', function(){
return gulp.src(appBuilderDir + '/*.css')
.pipe(concat('style.css'))
.pipe(gulp.dest(targetCssDir));
});
gulp.task('watch', function () {
gulp.watch(appScssDir + '/**/*.scss', ['app_scss', 'app_build_css']);
});
gulp.task('default', ['app_build_clean', 'app_scss', 'app_vendor_css', 'app_build_css', 'watch']);
所以当我更新scss文件时,它应该编译它们创建一个单独的css文件。然后,构建任务使用供应商文件对文件进行连接。但每次我保存文件时,它总是落后一步。以视频为例:http://screencast.com/t/065gfTrY
我已重命名任务,更改了手表回调中的顺序等。
我犯了一个明显的错误吗?
答案 0 :(得分:20)
使用GULP 3,我使用run-sequence包来帮助按顺序运行任务,而不是并行运行。这就是我配置watch
任务的方式,例如:
var gulp = require('gulp'),
runSequence = require('run-sequence');
gulp.task('watch', function() {
gulp.watch('templates/**/*.html', function(){ runSequence('templates', 'bundleJS') });
});
上面的示例显示了一个典型的watch
任务,它将gulp.watch
方法与更改后要侦听的文件挂钩,并在检测到更改时运行回调函数。然后调用runSequence
函数(在某个watch
的回调中),其中一系列任务以同步方式运行,这与并行运行任务的默认方式不同。
答案 1 :(得分:19)
Gulp在“相同”时间启动所有任务,除非您声明依赖项(或使流管道彼此管道)。
例如,如果您希望任务app_build_css
等待任务app_scss
和app_vendor_css
完成,请声明依赖项,
gulp.task('app_scss', function(){
return gulp.src(appScssDir + '/main.scss')
.pipe(sass({ style: 'compressed' }).on('error', gutil.log))
.pipe(autoprefix('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_vendor_css', function(){
return gulp.src(appProviderCssDir + '/*.css')
.pipe(minifyCSS({ keepSpecialComments: 0 }))
.pipe(concat('app_vendor.css'))
.pipe(gulp.dest(appBuilderDir));
});
gulp.task('app_build_css', ['app_scss', 'app_vendor_css'], function(){
return gulp.src(appBuilderDir + '/*.css')
.pipe(concat('style.css'))
.pipe(gulp.dest(targetCssDir));
});
gulp.task('watch', function () {
gulp.watch(appScssDir + '/**/*.scss', ['app_build_css']);
});
gulp.task('default', ['app_build_clean', 'app_build_css', 'watch']);
答案 2 :(得分:2)
现在Gulp v4已经推出了将近一年(于2017年底发布),它提供了一些很棒的方法来使用名为bach的库对任务进行排序。
https://github.com/gulpjs/bach
注意:由于v3存在一些安全漏洞,因此我建议您迁移到Gulp v4 [我不确定这些漏洞是否已被修补]。
Gulp v4引入了gulp.series
和gulp.parallel
,这使您可以创建任务并选择串联,并联或混合运行,如下所示。
说明:这将在 parallel 中运行scss
和js
任务,完成后将运行{{1 }}任务,因为它们属于系列。
watch
这是我的gulp文件看起来像的一个精简示例。
const defaultTasks = gulp.series(
gulp.parallel(scss, js),
watch
);
defaultTasks.description = 'Builds scss, and js, then watches them for changes and rebuilds upon change.';
module.exports = {
default: defaultTasks,
scss,
js
}