2014-10-11 69 views
10

我正在研究一個包含我的站點的前端和後端任務的gulp文件。
下面例如將Concat的我的劇本到app.js任務:整個任務的改變工作目錄

gulp.task 'frontend:scripts', -> 
    gulp.src frontendPath(scriptsFolder, scriptsPattern) 
     .pipe sourcemaps.init() 
     .pipe coffee() 
     .pipe concat 'app.js' 
     .pipe sourcemaps.write('.') 
     .pipe gulp.dest frontendPath(tempFolder, scriptsFolder) 

正如你可以看到我已經創建了一個幫手來提供正確的前端路徑:

frontendPath = (dirs...) -> path.join.apply null, ['frontend'].concat(dirs) 

但是我有要非常小心我的任務的所有步驟(特別是.src和.dest)都在前端文件夾中執行。

我知道您可以使用{ cwd: 'frontend' }選項來更改.src和.dest的工作目錄。但有沒有辦法改變整個工作目錄的任務?

回答

24

使用process.chdir更改工作目錄。我們可以在任何地方在任何地方進行更改,或者在您的情況下,在任務中更改它。

gulp.task('frontend', function(){ 
    process.chdir('...'); 
    gulp.src(...) 
}); 

gulp.task('backend', function(){ 
    process.chdir('...'); 
    gulp.src(...) 
}); 

確保使用最新版本的一飲而盡, 這個功能似乎是added recently

3

隨着gulp的工作方式,在srcdest之間的步驟中「改變目錄」是沒有意義的。

gulp.src從磁盤讀取文件到內存中。其後的.pipe只是將這些文件的內容(以及與文件相關的元數據 - 有關更多信息,請參見Vinyl file objects)傳遞給其他JavaScript函數,其中每個函數都只在文件的內存中版本上運行。這意味着他們不知道工作目錄,或者關心工作目錄。他們只是看到有關文件的傳入數據通過管道進入,對這些數據執行操作,並通過下一個.pipe發送出去。

所以我認爲,如果你真的在父導演中偏執,那麼對於src和dest,cwd是你能做的最好的。

所有這一切,你可以看看shelljs,它允許你改變當前節點進程的目錄。我認爲這可能被認爲是反管理模式,但可能值得一試。

+0

謝謝你的回答。請注意,我不想在'src'和'dest'之間的步驟中更改工作文件夾。我希望整個任務在子文件夾上運行。現在,我必須將所有球體加上我的子文件夾(或者將'cwd:'同時提供給'src'和'dest')。我希望有更好的方法。 – Zyphrax 2014-12-02 06:43:56

+0

夠公平,那麼我認爲shelljs模塊可能是你的朋友。 Fwiw,我認爲在子目錄前加上一個很常見的做法。 – thataustin 2014-12-02 07:58:50

+0

如果您想要在多個文件夾中運行多個命令並且這些命令僅在當前工作目錄下工作,該怎麼辦?例如運行'無服務器部署' – Tom 2017-12-11 20:35:37