使用 gulp-watch 创建一个正常的 "build" 任务,而无需重复任务

Create a normal "build" task with gulp-watch without having to duplicate tasks

过去,我曾使用 gulp.watch 创建一个 "watch" 任务,我在开发过程中会用到它。在 "watch" 任务中,我将有一个单独的手表,它可以 运行 满足任何需要。例如:

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

然后是一个 "build" 任务,它将 运行 所有东西放在一起:

gulp.task("build", ["js", "less"]);

效果很好,除了它意味着 -ever- LESS 文件需要在一次更改时重新编译,或者每个 JS 文件需要一次更改。

我已经改为使用 gulp-watch,所以我现在可以让它进行增量构建。我现在不再有 "watch" 任务,而是有如下所示的任务:

gulp.task("less", function () {
    return gulp.src("**/*.less")
        .pipe(watch("**/*.less"))
        .pipe(less())
        .pipe(gulp.dest("dist"));
});

这对于增量构建非常有效,但现在我想不出一个干净的方法来完成 "build" 任务,该任务只是构建而不进入监视模式,用于诸如部署之类的事情.

问题: 有没有一种 standard/clean 方法可以让我创建一个 "build" 任务,无需观看,基本上不必重复我所有的任务?

我最终想出的解决方案是使用全局 debug 值,该值通常设置为 true,但 build 任务设置为 false。然后,在任务中,watch 仅在 debug == true.

时才添加到管道中

示例:

var gulp = require('gulp'),
    runSequence = require('run-sequence'),
    watch = require('gulp-watch');
var debug = true;

gulp.task('copy', function () {
    var task = gulp.src('**/*.js');

    debug && task.pipe(watch());

    task.pipe(gulp.dest('dist'));
});

gulp.task('build:dev', ['copy']);

gulp.task('build', function (cb) {
    debug = false;
    runSequence('build:dev', cb);
});

如果我 运行 build:dev,它会 运行 copy 并将副本置于监视模式,因为监视是通过管道传输的,因为全局 debug 值为 true.

如果我 运行 build,它会将全局 debug 值设置为 false,因此手表不会通过管道输入,这意味着它只会执行没有观看的任务。

我也可以只为 debug == false 添加内容(例如,丑化)。

这不是很干净,也不太符合 gulp 理念,但它工作得相当好,所以我很满意。

=========

更新 Gulp 4.0

我最近开始玩 Gulp 4.0,现在你不能使用 运行Sequence(或者至少,它是多余的),所以你不能设置变量然后调用 运行 序列。我最终做的是创建一个名为“debug:off”的任务,我在构建链的开头调用它:

var gulp = require('gulp');
var debug = true;

gulp.task('debug:off', function (cb) { 
    debug = false;
    cb();
});

// ...

gulp.task('build:dev', gulp.parallel('task1', 'task2'));
gulp.task('build', gulp.serial('debug:off', 'build:dev'));

另一种方法是不使用这样的变量,您还可以在 运行 Gulp 时设置环境变量。适用于 Gulp.

的所有版本
// gulpfile.js
var debug = process.env.PROD

// command-line, debug mode
$ gulp

// command-line, prod mode
$ PROD=1 && gulp

环境变量不是我的偏好,但其他人似乎更喜欢它而不是使用任务来配置变量。