我想构造一个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的结果(管道位不会更改返回值的类型),它是一个节点流。

这基本上意味着您可以运行serverweb任务,并仅在它们成功完成后才使用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/

10-16 18:03