我想构造一个gulp任务,该任务将在运行自身之前有条件地手动调用一些其他任务。看到不赞成使用gulp.run('task')
之后,我得到了以下基本结构:
const build = {
server: () => {
return gulp.src(files.server)
...
.pipe(gulp.dest(files.outDir))
},
web: () => {
return gulp.src(files.web)
...
.pipe(gulp.dest(files.outDir))
}
}
gulp.task('serve', () => {
// run the server and if necessary, force it to stop first
const start = () => expressServer.start('./dist/main.js')
// don't try to run if build hasn't been run first
try {
fs.statSync('./dist/main.js') // throws an exception if the file doesn't exist
start()
} catch (err) {
// ----- TODO in parallel; build server and web
// afterwards; run server iff there were no errors
if (failed)
console.error(err)
else
start()
}
})
看来调用
build.server()
或build.web()
实际上确实在运行gulp任务,但是该函数会立即返回-我猜这意味着这些函数的主体是异步运行的吗?谁能帮助我了解:
gulp.src(...). ... .gulp.dest(...)
链实际上返回什么?我怀疑gulp是否异步运行这些操作?假设异步操作;我如何等待这些完成?
如果不是异步的,我该如何执行它们?
最佳答案
我发现DefinitelyTyped(Typescript)文件通常有助于弄清发生了什么。据我所知:
The gulp.src
function将给出一个NodeJS.ReadWriteStream
;
The node.d.ts file有点难以理解,但是基本上所有...Stream
都有一个pipe
方法,该方法接收流并返回相同/相似(?)类型之一。
因此,基本上,您返回gulp.src
的结果(管道位不会更改返回值的类型),它是一个节点流。
这基本上意味着您可以运行server
和web
任务,并仅在它们成功完成后才使用finish
callbacks of the streams those tasks return采取措施。
作为一个脚注,尽管我不熟悉确切的工作原理,但我认为merge-stream
可能也有帮助,如果您需要等待多个流完成。
这是一个基本示例(基于您的代码,减去try..catch
位):
var gulp = require("gulp");
var mergeStream = require("merge-stream");
const build = {
server: () => {
process.stdout.write("MYMESSAGE: Server...\n");
return gulp.src("src/nonexistent/server.js").pipe(gulp.dest("./build/server"));
},
web: () => {
process.stdout.write("MYMESSAGE: Web...\n");
return gulp.src("src/web.js").pipe(gulp.dest("./build/server"));
}
}
gulp.task("serve", () => {
const start = () => process.stdout.write("MYMESSAGE: Starting!\n");
try {
throw new Error("Simulated error!");
} catch(err) {
// In parallel build server and web, afterwards run
// server iff there were no erros.
mergeStream(build.server(), build.web())
.on("error", () => console.error(err))
.on("finish", () => start());
}
});
关于javascript - 有条件地调用GulpJS任务(手动),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35111135/