我有一个与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
命令实际上已完成,服务器正在运行?第一次手动刷新页面是一件非常微不足道的事,但这是学习新东西的机会。
答案 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']);
如果有人有更优雅的解决方案,我很乐意听到它!