我知道能够声明将在任务之前运行的依赖项的能力,例如
gulp.task('a', () => {});
gulp.task('b', () => {});
gulp.task('c', ['a', 'c'], () => {});
[任务'a'和'b'将在每次调用任务'c'之后且在执行任务'c'之前运行。
但是,如何在gulp.task
中以编程方式调用任意任务?
我使用gulp.start()做到了;像这样:
gulp.task('test1', function(){
gulp.start('test2');
})
gulp.task('test2', function(){
// do something
})
我当时使用的是gulp 3.9.1。看起来gulp.start()可能已被删除或弃用;但是还没有发生。
更新如果要像Novellizator所建议的那样将事情分解为单独的功能,它将是这样的:
function doSomething(){
// do something
}
gulp.task('test1', function(){
doSomething();
})
gulp.task('test2', function(){
doSomething();
})
这很简单,避免使用gulp.start()。
从Gulp 4+起,我发现这可以很好地替代gulp.start:
const task1 = () => { /*do stuff*/ };
const task2 = () => { /*do stuff*/ };
// Register the tasks with gulp. They will be named the same as their function
gulp.task(task1);
gulp.task(task2);
...
// Elsewhere in your gulfile you can run these tasks immediately by calling them like this
(gulp.series("task1", "task2")());
// OR
(gulp.parallel("task1", "task2")());
关于其他答案中“不要”的一般主题,取决于您在做什么。
[如果您正在考虑:
gulp.task("a", () => {
doSomethingInstant()
return doTaskB()
})
您想要:
gulp.task("meta-a", () => {
doSomethingInstant()
})
gulp.task("a", ["meta-a", "b"])
这是可行的,因为所有任务都是按顺序启动的,因此,如果您没有在“ meta-a”中执行任何异步操作,它将在“ b”开始之前完成。如果它是异步的,那么您需要更加明确:
gulp.task("meta-a", () => {
return doSomethingAsync()
})
function taskB() {
// Original task B code...
}
gulp.task("b", taskB)
gulp.task("a", ["meta-a"], taskB)
关于相关说明,您可以使用gulp v4中的gulp.series
或gulp.parallel
来启动任务。尽管它不是gulp.start
的直接替代品,但可以达到相同的目的。
示例:
v4之前
gulp.task('protractor', ['protractor:src']);
v4之后
gulp.task('protractor', gulp.series('protractor:src'));
如上述JeffryHouser所述,使用以下方法有效,但已弃用,在以后的版本中将其删除。我只是在3.9.1上尝试了以下方法,但效果很好。
代码:
// Variables
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
// Task to compile less -> css: Method 1- The bad way
gulp.task('default', function(){
gulp.src('src/*.less')
gulp.start('lessToCss');
});
gulp.task('lessToCss', function() {
gulp.src('src/*.less')
.pipe(less())
.pipe(gulp.dest('src/main.css'));
});
Novellizator在评论中提到的第二种方法是:
“将任务分解为功能,然后根据需要在其他任务中重用”,来自上述问题的建议
我通过使用lazypipe()https://www.npmjs.com/package/lazypipe来做到这一点
代码:
// Variables
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
var lazypipe = require('lazypipe');
var fixMyCSS = lazypipe()
.pipe(less); // Be CAREFUL here do not use less() it will give you an errror
// Task to compile less -> css: Method 2 - The nice way
gulp.task('default', function(){
//gulp.start('lessToCss');
gulp.src('src/*.less')
.pipe(fixMyCSS())
.pipe(gulp.dest('src/main.css'));
});
简要比较
方法1产生以下结果:
完成总共[[61 ms
方法2?-[23:03:24]开始“默认” ...-[23:03:24] 38毫秒后完成“默认”实际上是
38 ms]时的一半]
相差23毫秒
现在为什么是这种情况?老实说,我对gulp不够了解,但可以说方法2显然是更易读,可维护甚至更快的选择。只要您知道不要直接在lazypipe()
中调用流,它们都很容易编写。