Gulpjs将两项任务合并为一项任务
我目前有两个任务,都编译sass文件。 我仍然希望将这两个目录连接成单独的文件,但是如果我可以简单地创build一个“sass”任务来负责所有的sass编译,那么它似乎更易于维护。
// Compile Our Sass gulp.task('bootstrap-sass', function() { return gulp.src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(contact('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); }); gulp.task('site-sass', function() { return gulp.src('./public/app/scss/*.scss') .pipe(sass()) .pipe(contact('site.css')) .pipe(gulp.dest('./public/dist/css')); });
更新:
我试过这个:
// Compile Our Sass gulp.task('sass', function() { var bootstrap = function() { return gulp .src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(concat('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); }; var site = function() { return gulp .src('./public/src/scss/*.scss') .pipe(sass()) .pipe(concat('site.css')) .pipe(gulp.dest('./public/dist/css')); }; return Promise.all([bootstrap, site]); });
但现在看来,没有文件正在编译。 任何build议,我在做什么错?
我认为这样做的正确方法是使用任务依赖。
在gulp中,您可以定义在给定任务之前需要运行的任务。
例如:
gulp.task('scripts', ['clean'], function () { // gulp.src( ... });
在terminal中执行gulp scripts
时,在脚本任务之前运行clean。
在你的例子中,我有两个独立的SASS任务作为一个普通的SASS任务的依赖。 就像是:
// Compile Our Sass gulp.task('bootstrap-sass', function() { return gulp.src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(contact('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); }); gulp.task('site-sass', function() { return gulp.src('./public/app/scss/*.scss') .pipe(sass()) .pipe(contact('site.css')) .pipe(gulp.dest('./public/dist/css')); }); gulp.task('sass', ['bootstrap-sass', 'site-sass']);
您可以阅读关于Gulp食谱部分的任务依赖关系的更多信息: https : //github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md
有用。
var task1 = gulp.src(...)... var task2 = gulp.src(...)... return [task1, task2];
解决scheme1:
gulp.task('sass', function() { gulp.start('bootstrap-sass', 'site-sass'); })
gulp.start并行运行任务。 而且它是asynchronous的,这意味着'bootstrap-sass'可能会在'site-sass'之前完成。 但不推荐,因为
gulp.start是无意的,因为它可能会导致复杂的构build文件,我们不希望人们使用它
见https://github.com/gulpjs/gulp/issues/426
解决scheme2:
var runSequence = require('run-sequence'); gulp.task('sass', function (cb) { runSequence(['bootstrap-sass', 'site-sass'], cb); });
run-sequence是一个gulp插件。
按指定顺序运行一系列吞吐任务。 此函数旨在解决您定义运行顺序的情况,但不select或不能使用依赖关系。
runSequence(['bootstrap-sass', 'site-sass'], cb);
这一行同时运行“boostrap-sass”和“site-sass”。如果你想连续运行任务,你可以
runSequence('bootstrap-sass', 'site-sass', cb);
我只是find了一个叫做gulp-all
的gulp插件,然后试了一下。 使用起来很简单。
https://www.npmjs.com/package/gulp-all
包的文件说:
var all = require('gulp-all') var styl_dir = 'path/to/styles/dir' var js_dir = 'path/to/scripts/dir' function build() { return all( gulp.src(styl_dir + '/**/*') // build Styles .pipe(gulp.dest('dist_dir')), gulp.src(js_dir + '/**/*') // build Scripts .pipe(gulp.dest('dist_dir')) ) } gulp.task('build', build);
你也可以把子任务放在一个数组中:
var scriptBundles = [/*...*/] function build(){ var subtasks = scriptBundles.map(function(bundle){ return gulp.src(bundle.src).pipe(/* concat to bundle.target */) }) return all(subtasks) }
原来, site()
函数返回一个错误。 为了解决它,我需要确保bootstrap()
第一次运行,所以我结束了这个:
// Compile Our Sass gulp.task('sass', function() { var bootstrap = function() { return gulp .src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(concat('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); }; var site = function() { return gulp .src('./public/src/scss/*.scss') .pipe(sass()) .pipe(concat('site.css')) .pipe(gulp.dest('./public/dist/css')); }; return bootstrap().on('end', site); });
你有没有尝试过使用合并stream ?
merge = require('merge-stream'); // Compile Our Sass gulp.task('sass', function() { var bootstrap = gulp .src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(concat('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); var site = gulp .src('./public/src/scss/*.scss') .pipe(sass()) .pipe(concat('site.css')) .pipe(gulp.dest('./public/dist/css')); return merge(bootstrap, site); });
有关更多详细信息,请参阅https://blog.mariusschulz.com/2015/05/02/merging-two-gulp-streams
在gulp4 (仍然是阿尔法),我们有平行的,所以你可以做:
// Compile Our Sass gulp.task('bootstrap-sass', function() { return gulp.src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(contact('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); }); gulp.task('site-sass', function() { return gulp.src('./public/app/scss/*.scss') .pipe(sass()) .pipe(contact('site.css')) .pipe(gulp.dest('./public/dist/css')); }); gulp.task('sass', gulp.parallel('bootstrap-sass', 'site-sass')); // Combine
你也可以把它作为一个单独的任务来做:
gulp.task('sass', gulp.parallel( function() { return gulp.src('./public/bower/bootstrap-sass/lib/*.scss') .pipe(sass()) .pipe(contact('bootstrap.css')) .pipe(gulp.dest('./public/dist/css')); }, function() { return gulp.src('./public/app/scss/*.scss') .pipe(sass()) .pipe(contact('site.css')) .pipe(gulp.dest('./public/dist/css')); }));
我更喜欢第一种方法,因为它更容易维护
也可以通过传递一个如下所示的任务名称来创build另一个任务来编译其他任务:
gulp.task('sass-file-one', function () { console.log('compiled sass-file-one') }); gulp.task('sass-file-two', function () { console.log('compiled sass-file-two') }); gulp.task('compile-all-sass', ['sass-file-one','sass-file-two']);
那么你可以简单地运行gulp compile-all-sass
解决scheme:调用function!
return Promise.all([bootstrap(), site()])
注意parens bootstrap() , site(),所以他们返回一个承诺:)