2016-05-05 83 views
3

我有一個gulp腳本來操作一個主html文件,並將其重命名爲基於數組的幾個名稱。這是腳本。gulp重命名多個文件

gulp.task('default', function() { 
     var data = ['name1','name2']; 
     for(var name in data){    
     gulp.src('src/master.html') 
      .pipe(*dosomething...*) 
      .pipe(rename(function(path) { 
       path.basename = name; 
       path.extname = '.html'; 
      })) 
     .pipe(gulp.dest('dist')); 
     } 
    }); 

但是隻生成了name2.html。任何人都可以告訴我我的代碼有什麼問題。

+0

如何構建路徑? –

回答

1

Don't make functions within a loop

您的循環創建了多個函數,並將其傳遞給rename。這些功能中的每一個都指向相同的變量name。但是,這些功能不會立即執行,但只有在全部已創建完畢後才能執行。這意味着全部你的函數引用循環中最後一個值name

您需要創建多個name變量,方法是將循環構造替換爲for循環,該循環構造爲每個值創建一個新的函數作用域。 Array.forEach

您還在循環中創建多個流。您應該在與merge-stream合併之後返回這些流,以便吞下determine when your task has finished

var gulp = require('gulp'); 
var rename = require('gulp-rename'); 
var merge = require('merge-stream'); 

gulp.task('default', function() { 
    var data = ['name1','name2']; 
    var streams = []; 
    data.forEach(function(name) { 
    var stream = gulp.src('src/master.html') 
     .pipe(rename(function(path) { 
     path.basename = name; 
     path.extname = '.html'; 
     })) 
     .pipe(gulp.dest('dist')); 
    streams.push(stream); 
    }); 
    return merge(streams); 
}); 
+0

它的工作原理。謝謝。順便說一句,如果數據是一個json對象而不是數組。 forEach不適用於對象 –

+0

['Object.keys()'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)返回對象的數組鍵,讓你再次使用'.forEach()':Object.keys(jsonObject).forEach(function(key){' –

0

for ... in旨在循環通過對象的鍵。對於一個數組,鍵是索引值(0和1),所以我很驚訝name2.html正在生成 - 可能它已經在上一次運行。

要麼改變索引for循環for (var i = 0; i < data.length; i++) { ...或者從數組名稱使用path.basename = data[name];