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

标签 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 任务“完成”,直到bundle exec之后 jekyllserve 命令实际上是在服务器运行时完成的吗?第一次必须手动刷新页面是一个非常小的不便,但这是一个学习新东西的机会。

最佳答案

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

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)
}

关于node.js - 通过 child_process.exec 命令完成后执行 gulp.js 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46202703/

相关文章:

node.js - BrowserSync 无法在安装了 Nginx 的 VPS 上运行

javascript - gulp 4 的浏览器列表和同步完成问题

jekyll - 如何让我的 Jekyll 博客的标题带有页码?

ruby - Jekyll 博客中未加载 CSS/图像

node.js - BookshelfJS 在 FetchAll 中限制 withRelated 不起作用

javascript - 如何编译 Node.js 和 Angular

android - Phonegap 安装/构建错误

javascript - 覆盖 Gulp 中第二个源的文件

css - 未加载自定义图标字体

markdown - 如何在 Jekyll 中注入(inject) HTML