如何在各个终端中生成多个 gulp 监视任务?

How can I spawn multiple gulp watch tasks in respective terminals?

我目前有三个 gulp 任务,利用 gulp-watch。它们本质上是基本的,并且这样表示(简化)...

var gulp = require('gulp');
var watch = require('gulp-watch');

gulp.task('watch:a', function() {
    return watch('a/**/*.js', function () {
        // [...]
    });
});

gulp.task('watch:b', function() {
    return watch('b/**/*.js', function () {
        // [...]
    });
});

gulp.task('watch:c', function() {
    return watch('c/**/*.js', function () {
        // [...]
    });
});

但是,在我当前的工作流程中,我不得不打开三个终端,然后分别关闭它们。


有没有一种方法可以代替一个 gulp 任务,每个任务 运行 生成三个独立的终端 windows?我调查了 child process 但无法制定解决方案。理想情况下,我正在想象这样的东西......

gulp.task('watch', function() {
    launchProcess('gulp watch:a');
    launchProcess('gulp watch:b');
    launchProcess('gulp watch:c');
});

其中 launchProcess 有一些魔力,因此我可以将它们合并为一个命令。我只是在这里寻找方便,因为可能有三个以上的过程。一想到要手动关闭大量这些进程,我就感到畏缩。


这是我最初的尝试,摘自 Answer: Gulp – How Can I Open A New Tab In Terminal?,但这(只是试图解雇一个观察者)并没有让我的观察者任务按预期工作 - 文件更改没有任何反应。

var exec = require('child_process').exec;

gulp.task('watch', function(cb) {

    exec('gulp watch:a', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        cb(err);
    });
});

考虑到 this gulp.js project issue, but all testing indicates this will work as expected. I can simply call gulp.start(), which, I do not see in the gulp.js API docs 上的弃用评论,我想我可能找到了一种非常规的方法来实现这一点。嗯,我觉得不错...

gulp.task('watch', function() {
    gulp.start('watch:a');
    gulp.start('watch:b');
    gulp.start('watch:c');
});

所有任务似乎都在单个终端实例中适当地侦听。我要了!

你自己的解决方案并不是我对你问题的预期,因为正如你自己所说,它不会打开新的终端选项卡或任何东西。

如果您对此感到满意,下一行将与您的回答具有相同的效果。它还避免了 gulp.start(),Gulp.

的作者不推荐使用 gulp.start()
gulp.task('watch', ['watch:a', 'watch:b', 'watch:c']);

或者如果可能的话,您总是可以像下面这样组合您的监视任务。尽管您随后会失去 运行 单独执行这些任务的能力(如果您想这样做的话)。

gulp.task('watch', function() {
    watch('a/**/*.js', function () {
        // [...]
    });

    watch('b/**/*.js', function () {
        // [...]
    });

    watch('c/**/*.js', function () {
        // [...]
    });
});