2015-03-11 2 views
1

Я пытаюсь получить текущее имя файла внутри потока glob, чтобы я мог передать его jade, чтобы правильно назвать мои шаблоны. Обычно это будет выглядеть так:gulp tap enter бесконечный цикл

gulp.task('templatesjs', function() { 
    gulp.src('src/templates/*.jade') 
    .pipe(jade({ 
     client: true, 
     name:"filenamehere" 
    })) 
    .pipe(gulp.dest('build/templates')) 
}); 

Единственный ответ, который я нашел в Интернете, чтобы извлечь имя файла в потоке с помощью глотка отводов:

gulp.task('templatesjs', function() { 
    gulp.src('src/templates/*.jade') 
    .pipe(tap(function(file, t) { 
     var filename = file.relative.split('.')[0]; 
     return t.through(jade, [{client:true, name:filename}]); 
    })) 
    .pipe(gulp.dest('build/templates')) 
}); 

Но по какой-то причине это входит в бесконечный цикл. Если glob соответствует index.jade, например, файл file.relative первой итерации устанавливается как index.jade как ожидаемый, но затем он попадает в бесконечный цикл, где file.relative установлен в index.js, а сбой jade-компилятора пытаясь скомпилировать файл index.js. Причина, по которой я это знаю, состоит в том, что, если я не укажу клиент: true, file.relative - index.jade на первой итерации и index.html на всех итерациях после. Это, конечно, не сбой, но застревает в бесконечном цикле, компилируя index.html в index.html.

Мое решение состоит в том, чтобы проверять расширение файла и обрабатывать его только через нефрит, если я нахожусь в итерации, содержащей нефритовый файл. Это решает бесконечный цикл, но он неаккуратно и копирует файл нефрита в мой каталог сборки (а не огромную сделку). Он также работает только с первым файлом, и все файлы после получения имени первого файла. Я знаю, что делаю что-то не так, но я не могу понять, что.

gulp.task('templatesjs', function() { 
    gulp.src('src/templates/*.jade') 
    .pipe(tap(function(file, t) { 
     sourcefile = file.relative; 
     filename = sourcefile.split('.')[0] 
     if(sourcefile.split('.')[sourcefile.split('.').length-1]!='js') 
     return t.through(jade, [{client:true, name:filename}]); 
     else 
     return t; 
    })) 
    .pipe(gulp.dest('build/templates')) 
}); 
+0

устранил проблему с копированием файла нефрита в каталог сборки путем изменения «вернуться т;» вернуться;" в блоке else. – Nicholas

ответ

0

Так что я до сих пор не понимаю, виниловые потоки или кран, но по крайней мере, я все работает с помощью этого:

https://www.npmjs.com/package/gulp-jade-jst-concat

и получил это работает в 3-х минут после борьбы в течение 4 часов ...

Я не мог получить другой модуль (https://www.npmjs.com/package/gulp-tree-concat), чтобы работать даже после изменения примера. Надеюсь, это поможет кому-то с модулями gulp-jade на стороне клиента.

1

С through вы дублируете поток, эффективно создавая поток потоков, отсюда бесконечный цикл.

Это должно работать:

gulp.task('templatesjs', function() { 
    gulp.src('src/templates/*.jade') 
    .pipe(tap(function(file, t) { 
     var filename = file.relative.split('.')[0]; 
     return gulp.src(file.path) 
       .pipe(jade({client:true, name:filename})) 
       .pipe(gulp.dest('build/templates')); 
    })) 
}); 
Смежные вопросы