2017-09-13 102 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