2017-09-13 71 views
2

我有一个运行Browsersync的Jekyll项目,但我遇到了一个小问题,要让我的吞噬任务按预期方式运行。这里是我的gulpfile的简化版本:通过child_process.exec命令执行gulp.js任务完成

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任务并执行该命令。运行jekyll任务后,立即运行serve任务,并打开新的浏览器选项卡。该选项卡将永久旋转,因为在打开服务器时(通过jekyll)还没有运行。几秒钟后,手动刷新将使事情按预期工作,因为那时服务器正在运行。

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

回答

1

我会后,我已经找到工作最适合我,因为我原来问过这个问题的解决方案。

问题是我试图首先启动一台Jekyll服务器,然后再运行额外的gulp任务。也许有办法做到这一点,也许没有。我发现在一个命令提示符下旋转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']); 

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

2

给下面的一个尝试,我用它自己取得了巨大成功:

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

这看起来很有前途!我会尽快给它一个机会并报告。 – cmegown

+0

回调'完成'做了诡计! – eestein