2016-04-29 38 views
0

比方說,我有這樣的事情:傳遞一個參數來一飲而盡任務時,其他任務取決於它

var gulp = require("gulp"), 
    argv = require("yargs").argv; 

gulp.task("config", function (cb) { 
    "use strict"; 

    if (argv.ftp) { 
     console.log("Reading FTP settings..."); 
    } elseif (argv.sync) { 
     console.log("Reading Sync settings..."): 
    } 
}); 

gulp.task("ftp", ["config"], function(cb) { 
    console.log("FTPing..."); 
}); 

gulp.task("sync", ["config"], function(cb) { 
    console.log("Syncing..."); 
}); 

這裏的想法:

  • 用戶運行gulp ftp,依靠gulp config
  • gulp-config檢查config.json中與ftp相關的一些值,並提示用戶輸入缺少的任何內容。
  • gulp ftp然後繼續它的任務。

或者,

  • 用戶運行gulp sync,這依賴於gulp config
  • gulp-config檢查config.json中與sync相關的一些值,並提示用戶輸入缺少的任何內容。
  • gulp sync然後繼續執行它的任務。

我有這一切都工作得很好,但爲了得到config任務,無論是ftpsync的依賴正常工作,我必須跑gulp ftp --ftpgulp sync --sync。我想要做的是告訴gulp config,如果它作爲gulp ftp的依賴項運行,則假定--ftp標誌,並且它作爲gulp sync的依賴項運行,則假定--sync標誌。

所以我的問題是,有沒有辦法告訴當一個吞噬任務是另一個的依賴?當gulp-config由於依賴於gulp-ftp而運行時,有沒有辦法在gulp-config開始時檢查?


更新1:我有想法,這樣做if (argv.ftp || config === "ftp"),其中config是獲取無論是在ftpsync任務設置一個全局變量,但後來我意識到,不會因爲工作直到config任務完成後,變量纔會被設置。我會繼續研究......

+0

我不知道你的問題的直接答案,但我認爲你的問題可以通過一些重構來解決。你想試一下嗎? :) – qtuan

+0

是的,我正在尋找外部化我用來寫入'config.json'的兩個函數,我覺得我可能會繼續更新,因爲我會取得進展。 – JacobTheDev

回答

1

我希望做的是告訴gulp config,如果它正在運行爲gulp ftp的依賴,承擔--ftp標誌,並且它作爲gulp sync的依賴項運行,假定--sync標誌。

你其實可以這樣做,雖然我不願意推薦它,因爲它不是正式記錄的Gulp API的一部分。

Gulp從orchestrator繼承其任務運行能力,它將任務的執行順序存儲在數組seq中。在命令行上運行gulp ftp將導致seq陣列['config', 'ftp']

所以,如果config運行爲ftp依賴,它將seq陣列中ftp之前出現。你可以簡單地在你的config任務檢查此條件:

gulp.task("config", function() { 
    if (gulp.seq.indexOf('config') < gulp.seq.indexOf('ftp') || argv.ftp) { 
    console.log("Reading FTP settings..."); 
    } 
    if (gulp.seq.indexOf('config') < gulp.seq.indexOf('sync') || argv.sync) { 
    console.log("Reading Sync settings..."); 
    } 
}); 

另一個選項將檢查是否ftp被稱爲在命令行上。 yargs把非選項的命令行參數爲argv._

gulp.task("config", function() { 
    if (argv._.indexOf('ftp') >= 0 || argv.ftp) { 
    console.log("Reading FTP settings..."); 
    } 
    if (argv._.indexOf('sync') >= 0 || argv.sync) { 
    console.log("Reading Sync settings..."); 
    } 
}); 

但是,如果ftp沒有顯式調用在命令行上這是不行的。如果ftp本身被執行,則會發生這種情況,因爲另一個任務取決於它。

+0

非常感謝!這讓我走上了正確的道路,一旦我把它釘上去就會接受。 – JacobTheDev

0

這裏是我的解決方案與重構:

var gulp = require("gulp"); 

function config(type) { 
    "use strict"; 
    if (type == 'ftp') { 
     console.log("Reading FTP settings..."); 
    } else if (type == 'sync') { 
     console.log("Reading Sync settings..."); 
    } 
} 

gulp.task("config-ftp", function() { 
    config('ftp'); 
}); 

gulp.task("config-sync", function() { 
    config('sync'); 
}); 

gulp.task("ftp", ["config-ftp"], function(cb) { 
    console.log("FTPing..."); 
}); 

gulp.task("sync", ["config-sync"], function(cb) { 
    console.log("Syncing..."); 
}); 
+0

這就是我過去的做法,但我試圖將我的配置任務合併爲一個。感謝您的意見。 – JacobTheDev

相關問題