有条件地调用GulpJS任务(手动)
我想构build一个吞咽任务,在运行之前有条件地手动调用一些其他任务。 在看到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()
实际上运行build.web()
任务,但函数直接返回 – 我想这意味着这些函数的主体是asynchronous运行?
任何人都可以帮助我理解:
- 什么是
gulp.src(...). ... .gulp.dest(...)
gulp.src(...). ... .gulp.dest(...)
链实际返回? 我怀疑是否吞噬了这些asynchronous运行的操作? - 假设asynchronous操作; 我怎么能等待这些完成?
- 如果不是asynchronous的,我该如何执行它们?
我发现DefinitelyTyped(打字稿)文件经常帮助搞清楚发生了什么事情。 据我所知,
-
gulp.src
函数将给出一个NodeJS.ReadWriteStream
; - node.d.ts文件有点难以理解,但基本上所有
...Stream
Streams有一个pipe
方法,它接受一个stream并返回一个相同的/类似的(?)types。
所以基本上,你返回的是gulp.src
的结果(pipe道位不会改变返回值的types),这是一个节点stream。
这基本上意味着您可以运行server
和web
任务,并使用这些任务只有在成功完成时才会采取操作的streamfinish
callback 。
作为一个脚注,虽然我不熟悉精确的工作,但我认为如果您需要等待多个stream完成, 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()); } });