我有一个使用 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/