gulp重命名多个文件

时间:2016-05-05 05:31:21

标签: javascript node.js gulp gulp-rename

我有一个gulp脚本来操作主html文件,并根据数组将其重命名为多个名称。这是剧本。

    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。谁能告诉我我的代码有什么问题。

2 个答案:

答案 0 :(得分:1)

Don't make functions within a loop

您的循环会创建传递给rename的多个函数。每个函数都引用相同的变量name。但是,这些功能不会立即执行,而是仅在创建了所有之后才执行。这意味着所有你的函数引用name在循环中的最后一个值。

您需要创建多个name变量,方法是将您的for循环替换为为每个值创建新函数范围的循环结构,例如: Array.forEach

您还在循环中创建多个流。您应该在将这些流与merge-stream合并后返回这些流,以便gulp可以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);
});

答案 1 :(得分:0)

for ... in用于循环访问对象的键。对于数组,键是索引值(0和1),所以我很惊讶name2.html正在生成 - 也许它已经存在于之前的运行中。

更改为索引for循环for (var i = 0; i < data.length; i++) { ...或使用path.basename = data[name];

从数组中获取名称