2016-05-05 87 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];