创建一个正常的#34; build" gulp-watch的任务,无需复制任务

时间:2016-02-17 23:26:21

标签: gulp build-automation gulp-watch

过去我曾使用gulp.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,所以我现在可以让它进行增量构建。我现在不再拥有"手表"任务,而是具有如下所示的任务:

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

这适用于增量构建,但现在我无法找到一种干净的方式来构建"构建"对于诸如部署之类的事情而言,只是在没有将其踢入监视模式的情况下构建的任务。

问题:我是否有标准/干净的方式来创建"构建"任务,没有看,没有基本上复制我的所有任务?

1 个答案:

答案 0 :(得分:1)

我最终提出的解决方案是使用全局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添加内容(例如,uglifying)。

这不是超级干净,并且不适合gulp哲学,但它运作得相当好,所以我很满意。

======

Gulp 4.0的更新

我最近开始使用Gulp 4.0,你现在不能使用runSequence(或者至少,它是多余的),所以你不能设置变量然后调用runSequence。我最终做的是创建一个名为“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

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