2016-05-27 21 views
0

我正在設置一個工作流,以改進在大型應用程序中設計文件的linting,編譯和分發過程。我很樂意爲這個工作流程使用gulp,但這樣做需要一種同步關閉過程,確保本地目錄中的文件首先鏡像生產(遠程)目錄中文件的狀態。使用gulp僅覆蓋已存在的文件是目標目錄

我不想拉動遠程目錄的整個狀態,因爲它包含了數千個不需要本地存在的自動生成的文件。如何在從遠程服務器提取新版本之前檢查目標以確認文件名匹配?我不關心哪個文件更新,可以簡單地覆蓋路徑和文件名中匹配的所有內容。

回答

0

既然你想拉你已經有在目標文件,我會做:

var gulp = require('gulp'); 
var gt = require('through-gulp'); 
var read = require('gulp-read'); 

var remote_source_dir = "src/"; // must end with/

gulp.src('destination/**/*', {read:false}) 
    .pipe(gt(function(vinyl,enc,cb) { 
    vinyl.path = remote_source_dir + vinyl.relative; 
    vinyl.base = remote_source_dir; 
    cb(null, vinyl); 
    })) 
    .pipe(read()) 
    .pipe(gulp.dest("destination")); 

背景:咕嘟咕嘟流使用「乙烯」的對象。它們基本上包含文件路徑和文件內容。閱讀更多here

gulp.src()調用獲取我們要更新的目標中的所有文件名。我們將read設置爲false,以便不讀取目標目錄中文件的實際內容(因爲我們希望內容實際上是從源目錄中讀取的)。

gt()創建一個變換流,並且每個乙烯基對象都通過給定的函數。該函數調整文件的路徑和基礎,以便它們指向(遠程)源目錄。 cb(null, vinyl);最終報告轉換的結果。

然後,read()然後通過將文件內容讀入乙烯基對象來轉換現在包含正確源文件名的乙烯基。

最後gulp.dest()將文件寫入給定的目標目錄。提示:要進行測試,您可以將"destination"參數更改爲gulp.dest()函數,以將其他參數(例如,其他參數)更改爲其他參數,例如和gulp.dest()"destination2",它會將複製的文件輸出到不同的目錄。然後,您可以比較目的地和目的地2目錄以驗證正確的操作。

注意:如果目標目錄中的某個文件不存在於源目錄中,則該腳本將失敗。如果要排除目標目錄中的某些文件進行復制,可以使用例如gulp-filter,在gulp.src()gt()之間。或者,您可以在gt()轉換流中以編程方式檢查文件名,並且只需調用cb()而不是cb(null, vinyl)即可查看要跳過的文件。