创建一个普通的;“建立”;使用gulp watch执行任务,无需重复任务

创建一个普通的;“建立”;使用gulp watch执行任务,无需重复任务,gulp,build-automation,gulp-watch,Gulp,Build Automation,Gulp Watch,在过去,我使用gulp.watch创建一个“watch”任务,我在开发过程中使用它。在“watch”任务中,我会有一个单独的手表,可以运行任何需要的东西。例如: gulp.task("watch", function () { gulp.watch("**/*.js", ["js"]); gulp.watch("**/*.less", ["less"]); }); 然后是一个“构建”任务,该任务将所有内容一起运行: gulp.task("build", ["js", "less

在过去,我使用
gulp.watch
创建一个“watch”任务,我在开发过程中使用它。在“watch”任务中,我会有一个单独的手表,可以运行任何需要的东西。例如:

gulp.task("watch", function () {
    gulp.watch("**/*.js", ["js"]);
    gulp.watch("**/*.less", ["less"]);
});
然后是一个“构建”任务,该任务将所有内容一起运行:

gulp.task("build", ["js", "less"]);
工作正常,但这意味着在一次更改时需要重新编译的文件越来越少,或者在一次更改中需要重新编译每个JS文件

我改为使用
gulpwatch
,这样我就可以让它进行增量构建了。我现在不再有“监视”任务,而是有如下任务:

gulp.task("less", function () {
    return gulp.src("**/*.less")
        .pipe(watch("**/*.less"))
        .pipe(less())
        .pipe(gulp.dest("dist"));
});
这对于增量构建非常有效,但现在我无法找到一种干净的方法来拥有一个“构建”任务,它只构建,而不将其转入监视模式,例如部署


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

我最终提出的解决方案是使用一个全局
调试
值,该值通常设置为
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
并将copy置于监视模式,因为全局
debug
值为
true
,所以监视是通过管道进行的

如果我运行
build
,它会将全局
debug
值设置为
false
,这样手表就不会被导入,这意味着它只会执行任务而不监视

我也可以只为
debug==false
添加东西(比如,uglifying)

这不是超干净的,也不符合“大口大口”的理念,但效果相当不错,所以我对它很满意

=========

Gulp4.0的更新 我最近开始使用Gulp4.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
环境变量不是我的首选,但其他人似乎更喜欢它,而不是使用任务来配置变量