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

IT技术 javascript node.js coffeescript gulp
2021-02-06 16:53:53

在这样的片段中:

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"

develop任务中,我想运行clean,完成后运行coffee,完成后运行其他东西。但我想不通。这一段不行。请指教。

6个回答

默认情况下,gulp 同时运行任务,除非它们有明确的依赖关系。这对于诸如clean,您不想依赖的任务不是很有用,但您需要它们在其他所有事情之前运行。

专门编写了这个run-sequence插件来解决 gulp 的这个问题。安装后,像这样使用它:

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

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

您可以阅读包 README 上的完整说明——它还支持同时运行一些任务集。

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

但是,这是一个重大的突破性更改,因此您无需等待run-sequence今天就可以使用

您不需要为此使用插件,Gulp 具有用于任务依赖项的内置语法!
2021-03-14 16:53:53
惊人的module - 这是为什么需要它的一个很好的解释 - blog.mdnbar.com/gulp-for-simple-build-proccess - 这应该是公认的答案
2021-03-23 16:53:53
此外,任务依赖不是一个完整的解决方案。假设我有两个使用数据库独立运行测试的 gulp 任务。两者都不依赖于另一个,但我不希望它们中的任何一个同时运行,因为它们都需要使用数据库。
2021-04-02 16:53:53
@Indolering内置的任务相关的功能并没有解决这个问题的方案。依赖任务总是运行:没有内置的方式在某些时候连续运行两个任务,但不是每次都运行。 run-sequence解决了 gulp 中缺失的一个关键功能。
2021-04-04 16:53:53
@OverZealous 感谢您的插件!顺便说一句,该gulp-clean插件没有实现 Streams 2,所以它作为依赖项运行时存在问题。这已经在 0.3.0 版本中得到修复,我的同事提交了一个 PR 来转换它。
2021-04-10 16:53:53

这个问题唯一好的解决方案可以在 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']);
你定义了一个没有依赖的新任务?
2021-03-14 16:53:53
需要两个任务依次运行意味着紧密耦合。
2021-03-17 16:53:53
出于某种原因,我正ReferenceError: err is not defined试图在一项gulp-compass任务上运行它,我是否遗漏了什么?
2021-03-25 16:53:53
这在“一”和“二”之间产生了紧密的耦合。如果你想运行“二”而不运行“一”怎么办
2021-03-30 16:53:53
@waffl 此示例使用回调,这不是执行此操作的唯一方法。根据文档,您还可以“分别返回引擎应等待解决或结束的Promise或流”。因此,如果您在任务一中返回流,例如return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts');,关键是在定义任务二时将任务一标识为依赖项:gulp.task('two', ['one'], function() {... 任务二现在将在运行之前等待任务一结束。
2021-04-03 16:53:53

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

gulp.task('develop', gulp.series('clean', 'coffee'))

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

@musicin3d 您所说的有效,但您必须将一项任务与前一项任务相结合。例如,我希望能够在之前不必总是 lint 的情况下进行构建。拥有独立任务并使用外部工具决定执行顺序是更好的解决方案。
2021-03-18 16:53:53
我看不出重点,真的。如果你绝对需要在 B 运行后才运行 A,那么 A 依赖于 B。为什么你不能直接指定 B 是 A 的依赖项?gulp.task('coffee', ['clean'], function(){...}); gulp.task('develop', ['coffee']);
2021-03-19 16:53:53
它是 2017 年,他们仍然没有介绍它。伟大的。
2021-03-23 16:53:53
它是 2018 年,他们终于推出了它。伟大的。
2021-03-31 16:53:53
所有新人的首选方法。他们真的应该从 gulp 4 开始,跳过所有 3.* 的麻烦和广泛的反模式。
2021-04-02 16:53:53

我使用generator-gulp-webapp Yeoman 生成器生成了一个节点/gulp 应用程序它以这种方式处理了“干净的难题”(转换为问题中提到的原始任务):

gulp.task('develop', ['clean'], function () {
  gulp.start('coffee');
});
这正是我需要的(而且非常简单)。它解决了我需要做一些类似清理作为先前依赖项来构建依赖项而不将清理设置为这些任务的依赖项的情况。PS:关于 gulp.start() 位的信息 - 警告清空者github.com/gulpjs/gulp/issues/426
2021-03-25 16:53:53
在这种情况下,我如何检测该coffee任务已完成?如果我没有检测到它,develop任务将比coffee
2021-03-25 16:53:53
已经从run-sequence源代码中得到了答案gulp.on('task_stop')有关详细信息,请参阅我的扩展答案:stackoverflow.com/a/38818657/3027390
2021-03-25 16:53:53
这就说得通了; 主任务(及其依赖任务)完成后的回调。谢谢。
2021-04-01 16:53:53
如果有人想知道为什么没有官方文档gulp.start()gulp成员的这个回答解释说:(gulp.start is undocumented on purpose because it can lead to complicated build files and we don't want people using it来源:github.com/gulpjs/gulp/issues/426#issuecomment-41208007
2021-04-05 16:53:53

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

使用 run-sequence,您的任务将如下所示:

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

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

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

注意: 如果只开始任务而不听结果,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');
});

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

您可能还想知道为什么没有gulp.start(). gulp 成员的这个回答解释了这些事情:

gulp.start 故意没有记录,因为它会导致复杂的构建文件,我们不希望人们使用它

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

给这个人两杯咖啡!删除侦听器的解决方案非常有效!
2021-03-11 16:53:53
这确实是答案,或者只是“gulp 4”。运行顺序是健壮的。
2021-04-10 16:53:53