【发布时间】:2016-01-31 06:41:07
【问题描述】:
我想构建一个 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 是否异步运行这些操作? - 假设异步操作;我该如何等待这些完成?
- 如果不是异步的,我该如何执行它们?
【问题讨论】:
-
对于同步操作,另见这里➝stackoverflow.com/a/26390567/444255。使“第三”成为一项独特的任务,并依赖于“第二”和“第一”。还要使“第二”取决于“第一”。这应该保证等待对方完成。
-
@FrankN 一个很好的建议,但我想不出一个适合 OP 上下文的好方法(因为 OP 想在代码中有条件地启动任务)。如果您知道我有兴趣从您那里得到答案,那么我也有机会学到一些东西:-)
-
@FrankN 谢谢。我试图避免同步任务,因为我将整个 node_modules 目录复制到我的 dist 文件夹中(可以理解,这需要很长时间 - 但我已经解决了这个问题)。我仍然(慢慢地)对 Gulp 有所了解,最后我对一些并不真正需要它的东西采用了一种非常复杂的方法!
标签: javascript node.js asynchronous gulp