2016-05-05 2 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')); 
     } 
    }); 

Но генерируется только имя2.html. Может кто-нибудь сказать мне, что не так с моим кодом.

+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); 
}); 
+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 (var i = 0; i < data.length; i++) { ... или получить имя из массива с помощью path.basename = data[name];

Смежные вопросы