Gulpjs将两个任务合并为一个任务

Noa*_*ich 53 gulp gulp-sass

我目前有两个任务,都编译sass文件.我仍然希望将两个目录连接成单独的文件,但是如果我可以简单地创建一个负责所有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'));
});
Run Code Online (Sandbox Code Playgroud)

更新:

我试过这个:

// 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]);
});
Run Code Online (Sandbox Code Playgroud)

但现在看来这两个文件都没有被编译.对我做错了什么建议?

mik*_*elb 63

我认为这样做的正确方法是使用任务依赖.

在gulp中,您可以定义需要在给定任务之前运行的任务.

例如:

gulp.task('scripts', ['clean'], function () {
    // gulp.src( ...
});
Run Code Online (Sandbox Code Playgroud)

在做gulp scripts在终端,干净的脚本任务之前运行.

在您的示例中,我将两个单独的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']);
Run Code Online (Sandbox Code Playgroud)

您可以在Gulp食谱部分阅读有关任务依赖性的更多信息:https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md

  • 对于那些在 2019 年左右偶然发现这一点的人:这在 Gulp 4 中不起作用。请参阅使用“并行”和/或“系列”的其他答案。 (3认同)

Den*_*i35 32

有用.

var task1 = gulp.src(...)...
var task2 = gulp.src(...)...
return [task1, task2];
Run Code Online (Sandbox Code Playgroud)

  • 伟大的,这是迄今为止最简单的解决方案,就像一个魅力. (2认同)
  • 这不会返回流。此任务不能是依赖项。 (2认同)

gzc*_*gzc 21

解决方案1:

gulp.task('sass', function() {
  gulp.start('bootstrap-sass', 'site-sass');
})
Run Code Online (Sandbox Code Playgroud)

gulp.start并行运行任务.它是异步的,这意味着'bootstrap-sass'可能在'site-sass'之前完成.但不建议这样做

gulp.start有意无证,因为它可能导致复杂的构建文件,我们不希望人们使用它

请参阅https://github.com/gulpjs/gulp/issues/426

解决方案2:

var runSequence = require('run-sequence');
gulp.task('sass', function (cb) {
  runSequence(['bootstrap-sass', 'site-sass'], cb);
});
Run Code Online (Sandbox Code Playgroud)

run-sequence是一个gulp插件.

按指定顺序运行一系列gulp任务.此函数旨在解决已定义运行顺序但选择不使用或不使用依赖关系的情况.

runSequence(['bootstrap-sass', 'site-sass'], cb);
Run Code Online (Sandbox Code Playgroud)

这行并行运行'boostrap-sass'和'site-sass'.如果你想连续运行任务,你可以

runSequence('bootstrap-sass', 'site-sass', cb);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 10

使用Gulp4,您可以使用:

  • gulp.series 用于顺序执行
  • gulp.parallel 用于并行执行

    gulp.task('default', gulp.series('MyTask001', 'MyTask002'));
    gulp.task('default', gulp.parallel('MyTask001', 'MyTask002'));

关于此处的文章
您不再需要运行序列插件
您需要安装:npm install -D gulp @ next


小智 5

我刚刚发现了一个gulp插件,gulp-all并试了一下.它使用起来很简单.

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);
Run Code Online (Sandbox Code Playgroud)

你也可以把子任务放在一个数组中:

var scriptBundles = [/*...*/]

function build(){
    var subtasks = scriptBundles.map(function(bundle){
        return gulp.src(bundle.src).pipe(/* concat to bundle.target */)
    })
    return all(subtasks)
}
Run Code Online (Sandbox Code Playgroud)

  • 我编辑了你的答案,引用你从包的文档中复制的内容.你肯定还应该在你的答案中添加一个警告(就像包本身一样),它只适用于尚未发布的Gulp 4. (3认同)

sma*_*c89 5

Gulp 版本 4 中,我们有parallel,所以你可以:

// Compile Our Sass
gulp.task('bootstrap-sass', function() {
  return gulp.src('./public/bower/bootstrap-sass/lib/*.scss')
    .pipe(sass())
    .pipe(concat('bootstrap.css'))
    .pipe(gulp.dest('./public/dist/css'));
});

gulp.task('site-sass', function() {
  return gulp.src('./public/app/scss/*.scss')
    .pipe(sass())
    .pipe(concat('site.css'))
    .pipe(gulp.dest('./public/dist/css'));
});

gulp.task('sass', gulp.parallel('bootstrap-sass', 'site-sass')); // Combine
Run Code Online (Sandbox Code Playgroud)

您还可以通过执行以下操作将其编写为单个任务:

gulp.task('sass', gulp.parallel(
  function() {
      return gulp.src('./public/bower/bootstrap-sass/lib/*.scss')
        .pipe(sass())
        .pipe(concat('bootstrap.css'))
        .pipe(gulp.dest('./public/dist/css'));
  },
  function() {
      return gulp.src('./public/app/scss/*.scss')
        .pipe(sass())
        .pipe(concat('site.css'))
        .pipe(gulp.dest('./public/dist/css'));
  }));
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一种方法,因为它更容易维护