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

时间:2017-09-13 16:34:20

标签: node.js gulp jekyll

我有一个与Browsersync一起运行的Jekyll项目,但我遇到了一个小问题,让我的gulp任务按预期/期望运行。这是我的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任务完成"#34;直到之后 bundle exec jekyll serve命令实际上已完成,服务器正在运行?第一次手动刷新页面是一件非常微不足道的事,但这是学习新东西的机会。

2 个答案:

答案 0 :(得分:2)

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

onStart

答案 1 :(得分:1)

自从我最初提出这个问题以来,我发布了我发现最适合我的解决方案。

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

最终,代码中真正需要更改的只是删除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']);

如果有人有更优雅的解决方案,我很乐意听到它!