如何一个接一个地顺序运行Gulp任务

iLe*_*ing 393 javascript node.js coffeescript gulp

在这样的代码片段中:

gulp.task "coffee", ->
    gulp.src("src/server/**/*.coffee")
        .pipe(coffee {bare: true}).on("error",gutil.log)
        .pipe(gulp.dest "bin")

gulp.task "clean",->
    gulp.src("bin", {read:false})
        .pipe clean
            force:true

gulp.task 'develop',['clean','coffee'], ->
    console.log "run something else"
Run Code Online (Sandbox Code Playgroud)

develop任务中我想要运行clean并在完成后运行coffee,当完成时,运行其他东西.但我无法弄明白.这件作品不起作用.请指教.

Ove*_*ous 411

默认情况下,gulp同时运行任务,除非它们具有显式依赖关系.这对于clean您不想依赖的任务非常有用,但是您需要它们才能在其他任何事情之前运行.

我专门写了这个run-sequence插件来解决这个问题.安装后,使用它如下:

var runSequence = require('run-sequence');

gulp.task('develop', function(done) {
    runSequence('clean', 'coffee', function() {
        console.log('Run something else');
        done();
    });
});
Run Code Online (Sandbox Code Playgroud)

您可以阅读自述文件包README上的完整说明 - 它还支持同时运行一些任务集.

请注意,这将在gulp的下一个主要版本中(有效)修复,因为它们完全消除了自动依赖性排序,并提供了类似的工具run-sequence,允许您手动指定运行顺序的方式.

然而,这是一个重大的突破性变化,所以没有理由等待你run-sequence今天可以使用.

  • 我很感谢你为此提出了一个解决方案,但是我们需要额外的工具来获得顺序执行是荒谬的.顺序执行应该是默认的,或者至少他妈的很容易做到.Makefile已连续执行了40年.JS生态系统让我感到恶心.73兆字节的node_modules只是为了编译没有任何功能的样板项目,并且仍然不包括顺序执行的能力.操作系统适合较小的空间,它们具有内核和驱动程序FFS. (5认同)
  • @Inlerlering内置的任务依赖功能确实_not_解决了这种情况.始终运行相关任务:没有内置方法可以在_some_行中连续运行两个任务,但不是_every_ time."run-sequence"解决了gulp中缺失的关键功能. (3认同)
  • 惊人的模块 - 下面是一个很好的解释为什么需要它 - http://blog.mdnbar.com/gulp-for-simple-build-proccess-这应该是接受的答案 (3认同)
  • @OverZealous感谢插件!顺便说一下,`gulp-clean`插件没有实现Streams 2,所以它有作为依赖项运行的问题.这已经在发布版本0.3.0中得到修复,我的同事提交了一份PR来转换它. (2认同)
  • 此外,任务依赖性不是一个完整的解决方案.假设我有两个gulp任务,使用数据库独立运行测试.两者都不依赖于另一个,但我不希望它们中的任何一个同时运行,因为它们都需要使用数据库. (2认同)

Mat*_*eré 371

这个问题的唯一好方法可以在gulp文档中找到,可以在这里找到

var gulp = require('gulp');

// takes in a callback so the engine knows when it'll be done
gulp.task('one', function(cb) {
  // do stuff -- async or otherwise
  cb(err); // if err is not null and not undefined, the orchestration will stop, and 'two' will not run
});

// identifies a dependent task must be complete before this one begins
gulp.task('two', ['one'], function() {
  // task 'one' is done now
});

gulp.task('default', ['one', 'two']);
// alternatively: gulp.task('default', ['two']);
Run Code Online (Sandbox Code Playgroud)

  • 这在"一"和"二"之间产生紧密耦合.如果你想在不运行'one'的情况下运行'two'怎么办 (24认同)
  • @waffl这个例子使用了一个回调,这不是唯一的方法.根据[docs](https://github.com/gulpjs/gulp/blob/master/docs/API.md#return-a-stream),您还可以"返回引擎应该等待的承诺或流分别解决或结束." 因此,如果你在任务1中返回一个流,例如`return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts') );`,关键是在定义任务2时将任务1识别为依赖:`gulp.task('two',['one'],function(){...`任务2现在将等待任务1在跑步前结束. (11认同)
  • 需要顺序运行两个任务意味着紧密耦合. (8认同)
  • 由于某种原因,我得到`ReferenceError:错误未被定义`试图在'gulp-compass`任务上运行它,我错过了什么? (6认同)
  • 你定义一个没有依赖的新任务? (5认同)
  • 指向异步文档的链接在这里,https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support (3认同)

mas*_*shi 118

它尚未正式发布,但即将推出的Gulp 4.0可让您轻松地与gulp.series进行同步任务.你可以这样做:

gulp.task('develop', gulp.series('clean', 'coffee'))
Run Code Online (Sandbox Code Playgroud)

我发现了一篇很好的博客文章,介绍了如何升级和利用这些简洁的功能: 通过示例迁移到gulp 4

  • 2017年,他们仍然没有介绍它.大. (186认同)
  • 我真的没有看到这一点.如果你绝对需要A只在B运行后运行,那么A依赖于B.为什么你不能指定B是A的依赖?`gulp.task('coffee',['clean'],function(){...}); gulp.task('develop',['coffee']);` (13认同)
  • 它的2018年,他们终于确实介绍了它.大. (9认同)
  • 所有新人的选择方法.他们应该从吞咽4开始,跳过所有3.*麻烦和广泛的反模式. (3认同)
  • @ musicin3d你说的是什么,但是你将一项任务与之前的任务结合起来.例如,我希望能够在不使用lint之前构建.这是一个更好的解决方案,可以使用外部工具完成独立任务并确定执行顺序. (3认同)

Ste*_*eve 54

我使用generator-gulp-webapp Yeoman生成器生成了一个node/gulp app .它以这种方式处理"干净的难题"(转换为问题中提到的原始任务):

gulp.task('develop', ['clean'], function () {
  gulp.start('coffee');
});
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道为什么没有'gulp.start()`的官方文档,gulp成员的这个答案解释说:`gulp.start是故意的,因为它可能导致复杂的构建文件,我们不希望人们使用它`(来源:https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007) (4认同)
  • 这是我需要的确切(而且非常简单).它解决了我需要做一些像clean作为前面的依赖项来构建依赖项而不将clean设置为对这些任务的依赖的情况.PS:有关gulp.start()位的信息 - 告诫者:https://github.com/gulpjs/gulp/issues/426 (2认同)

thy*_*bzi 32

run-sequence是最清晰的方式(至少在Gulp 4.0发布之前)

使用运行顺序,您的任务将如下所示:

var sequence = require('run-sequence');
/* ... */
gulp.task('develop', function (done) {
    sequence('clean', 'coffee', done);
});
Run Code Online (Sandbox Code Playgroud)

但是如果你(出于某种原因)不想使用它,gulp.start方法将有助于:

gulp.task('develop', ['clean'], function (done) {
    gulp.on('task_stop', function (event) {
        if (event.task === 'coffee') {
            done();
        }
    });
    gulp.start('coffee');
});
Run Code Online (Sandbox Code Playgroud)

注意: 如果您只是在不收听结果的情况下启动任务,则develop任务将早于完成coffee,这可能会令人困惑.

您也可以在不需要时删除事件侦听器

gulp.task('develop', ['clean'], function (done) {
    function onFinish(event) {
        if (event.task === 'coffee') {
            gulp.removeListener('task_stop', onFinish);
            done();
        }
    }
    gulp.on('task_stop', onFinish);
    gulp.start('coffee');
});
Run Code Online (Sandbox Code Playgroud)

考虑也有task_err活动,你可能要听. task_stop成功完成task_err时触发,当出现错误时出现.

您可能也想知道为什么没有官方文档gulp.start().来自gulp成员的答案解释了这些事情:

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

(来源:https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007)


sen*_*tor 26

根据Gulp文档:

在依赖项完成之前,您的任务是否正在运行?确保您的依赖项任务正确使用异步运行提示:接受回调或返回承诺或事件流.

要同步运行您的任务序列:

  1. 返回事件流(例如gulp.src)以gulp.task通知任务流何时结束.
  2. 在第二个参数中声明任务依赖项gulp.task.

查看修订后的代码:

gulp.task "coffee", ->
    return gulp.src("src/server/**/*.coffee")
        .pipe(coffee {bare: true}).on("error",gutil.log)
        .pipe(gulp.dest "bin")

gulp.task "clean", ['coffee'], ->
      return gulp.src("bin", {read:false})
        .pipe clean
            force:true

gulp.task 'develop',['clean','coffee'], ->
    console.log "run something else"
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确的答案!回归任务就行了!谢啦. (4认同)

CPP*_*CPP 9

我遇到了同样的问题,解决方案对我来说非常简单.基本上将您的代码更改为以下,它应该工作.注意:gulp.src之前的返回对我来说完全不同.

gulp.task "coffee", ->
    return gulp.src("src/server/**/*.coffee")
        .pipe(coffee {bare: true}).on("error",gutil.log)
        .pipe(gulp.dest "bin")

gulp.task "clean",->
    return gulp.src("bin", {read:false})
        .pipe clean
            force:true

gulp.task 'develop',['clean','coffee'], ->
    console.log "run something else"
Run Code Online (Sandbox Code Playgroud)


Ass*_*sky 8

尝试了所有提出的解决方案,似乎都有自己的问题.

如果您实际查看Orchestrator源代码,特别是.start()实现,您将看到如果最后一个参数是函数,它将把它视为回调.

我为自己的任务写了这个片段:

  gulp.task( 'task1', () => console.log(a) )
  gulp.task( 'task2', () => console.log(a) )
  gulp.task( 'task3', () => console.log(a) )
  gulp.task( 'task4', () => console.log(a) )
  gulp.task( 'task5', () => console.log(a) )

  function runSequential( tasks ) {
    if( !tasks || tasks.length <= 0 ) return;

    const task = tasks[0];
    gulp.start( task, () => {
        console.log( `${task} finished` );
        runSequential( tasks.slice(1) );
    } );
  }
  gulp.task( "run-all", () => runSequential([ "task1", "task2", "task3", "task4", "task5" ));
Run Code Online (Sandbox Code Playgroud)