通过child_process.exec命令执行gulp.js任务完成

我有一个与Browsersync运行的Jekyll项目,但我遇到了一个小问题,让我的吞咽任务按预期/期望运行。 这是我的gulpfile的简化版本:

const gulp = require('gulp'); const browserSync = require('browser-sync').create(); gulp.task('jekyll', () => { return require('child_process').exec('bundle exec jekyll serve'); }); gulp.task('serve', ['jekyll'], () => { browserSync.init({ proxy: 'localhost: 4000' }); gulp.watch('_site/**/*.html').on('change', browserSync.reload); }); gulp.task('default', ['serve']); 

什么是期望的/期望的jekyll任务运行并执行命令,这导致主动运行的服务器。 然后serve任务运行,这将打开一个新的标签指向已经运行的jekyll服务器。 一切都是正确的世界。

实际发生的事情 :运行jekyll任务并执行命令。 serve任务在jekyll任务运行后立即运行,并打开一个新的浏览器选项卡。 该标签将永远旋转,因为在打开时,服务器(通过jekyll)还没有运行。 几秒钟后,手动刷新将使事情按预期工作,因为那时服务器正在运行。

我的主要问题是 :如何才能防止jekyll任务被“完成”,直到bundle exec jekyll serve命令实际上完成与服务器运行? 第一次手动刷新页面是非常麻烦的,但这是一个学习新东西的机会。

请尝试以下方法,我自己使用它取得了巨大的成功:

 const child = require("child_process"); const gutil = require("gulp-util"); gulp.task("jekyll", (done) => { let jekyll = child.spawn("jekyll", ["serve", "--incremental", "--drafts"]) .on("close", () => { done(); // let gulp know the task has completed }); let jekyllLogger = function (buffer) { buffer.toString() .split(/\n/) .forEach(function (message) { if (message) { gutil.log("Jekyll: " + message); } }); }; jekyll.stdout.on("data", jekyllLogger); jekyll.stderr.on("data", jekyllLogger) } 

自从我最初提出这个问题以来,我会发布我发现对我最好的解决scheme。

问题是我试图先启动一台Jekyll服务器,然后再运行额外的吞吐任务。 也许有办法做到这一点,也许没有。 我发现,在一个命令提示符下旋转Jekyll服务器,然后在另一个执行剩余的吞咽任务是答案。

最终所有的代码都需要改变,只是简单地删除了jekyll任务:

 const gulp = require('gulp'); const browserSync = require('browser-sync').create(); gulp.task('jekyll', () => { return require('child_process').exec('bundle exec jekyll serve'); }); gulp.task('serve', () => { browserSync.init({ proxy: 'localhost: 4000' }); gulp.watch('_site/**/*.html').on('change', browserSync.reload); }); gulp.task('default', ['serve']); 

如果有人有一个更优雅的解决scheme,我很乐意听到它!