有条件地调用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。

这基本上意味着您可以运行serverweb任务,并使用这些任务只有在成功完成时才会采取操作的streamfinishcallback 。

作为一个脚注,虽然我不熟悉精确的工作,但我认为如果您需要等待多个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()); } });