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

标签 gulp build-automation gulp-watch

过去,我使用 gulp.watch 创建一个在开发过程中使用的“监视”任务。在“监视”任务中,我将有一个单独的监视,它可以运行所需的任何内容。例如:

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

然后是一个“构建”任务,它将一起运行所有内容:

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

效果很好,只不过这意味着在一次更改时需要重新编译很少的文件,或者在一次更改时需要重新编译每个 JS 文件。

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

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

这对于增量构建非常有用,但现在我无法找到一种干净的方法来执行“构建”任务,该任务仅在不进入监视模式的情况下进行构建,以进行诸如部署之类的事情。

问题:是否有一种标准/干净的方法可以让我创建“构建”任务,而无需观看,而无需基本上重复我的所有任务?

最佳答案

我最终提出的解决方案是使用全局debug值,通常设置为true,但是build任务将其设置为 false。然后,在任务中,仅当 debug == true 时,watch 才会添加到管道中。

示例:

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,因此 watch 不会通过管道传输,这意味着它将直接做任务,不看。

我还可以添加仅用于 debug == false 的内容(例如,丑化)。

这不是 super 干净,也不太符合 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

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

关于gulp - 使用 gulp-watch 创建正常的 "build"任务,而无需重复任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35469815/

相关文章:

gulp - compass 失败 : You must compile individual stylesheets from the project directory.

javascript - 如何将 styledown 与 gulp 一起使用?

php - 尝试在 laravel 上运行 gulp 时出现错误

javascript - 纯前端代码存在哪些构建系统?

jenkins - 我如何调查匿名导致jenkins构建中止的原因

javascript - 如何通过 gulp-if 和懒惰管道使用多个管道?

java - 如何自动化 IntelliJ IDEA 11 项目的 Java 构建过程?

javascript - gulp 4.0 : gulp-remember or gulp-cache prevent sass to compile properly (Incremental build)

javascript - gulp-inject 不适用于 gulp-watch

node.js - 使用 gulp-file-include 观看 Gulp watch