过去我曾使用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"));
});
这适用于增量构建,但现在我无法找到一种干净的方式来构建"构建"对于诸如部署之类的事情而言,只是在没有将其踢入监视模式的情况下构建的任务。
问题:我是否有标准/干净的方式来创建"构建"任务,没有看,没有基本上复制我的所有任务?
答案 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,你现在不能使用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
环境变量不是我的偏好,但其他人似乎更喜欢使用任务来配置变量。