使用 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
环境变量不是我的偏好,但其他人似乎更喜欢它而不是使用任务来配置变量。
过去,我曾使用 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
环境变量不是我的偏好,但其他人似乎更喜欢它而不是使用任务来配置变量。