2016-03-07 3 views
12

У меня возникла проблема с копированием набора файлов и при вызове .dest («некоторая папка») вся структура папок была потеряна.Как влияет базовый параметр gulp.src & gulp.dest

Я искал и нашел ответ, предполагающий, что я должен предоставить {base:'.'} в качестве опции при моем вызове gulp.src(...) для решения этой проблемы.

documentation for gulp.src options только говорит, что его варианты:

Опции перейти к узлу-Глоб через Глоб-поток.

Ознакомиться с базой node-glob documentation for its options там нет.
И glob-stream options documentation только утверждает, что

«по умолчанию это все до того, как Глоб начинается (см Глоб-родителя)»

Так не много помощи здесь тоже.

Итак, какое влияние имеет параметр base на gulp.src на файлы viny6l в созданном потоке и как он влияет на команду gulp.dest?

ответ

27

Вы не смотрите официальную документацию по глотку. http://github.com/arvindr21/gulp - это только какая-то вилка парня из gulub gitub repo. Официальное репо - http://github.com/gulpjs/gulp/, где base option is indeed documented.

Чтобы ответить на ваш вопрос:

Если вы не укажете base опцию самостоятельно, то все перед первым Глобо в ваших gulp.src() дорожках автоматически используются в качестве опции base и пропущено при записи в папку назначения.

Допустим, вы имеете следующие файлы:

some/path/example/app/js/app.js 
some/path/example/vendor/js/vendor.js 
some/path/example/vendor/lib/js/lib.js 

И это ваш Gulpfile.js:

gulp.src('some/path/**/js/*.js') 
    .pipe(gulp.dest('output')); 

В этом случае все до ** автоматически используется в качестве base опции. Таким образом, выше, по существу, эквивалентно следующему:

gulp.src('some/path/**/js/*.js', {base:'some/path/'}) 
    .pipe(gulp.dest('output')); 

Что это означает, что some/path/ удаляется с пути каждого файла, который соответствует шаблону в gulp.src(). Полученная структура в папке output выглядит следующим образом:

output/example/app/js/app.js 
output/example/vendor/js/vendor.js 
output/example/vendor/lib/js/lib.js 

Так определенная часть структуры каталогов исходных файлов действительно теряется. Сколько из вашей структуры каталогов вы теряете, зависит от того, где первый глобус в вашем шаблоне gulp.src().

Если вы хотите, чтобы избежать этого вы должны явно указать base вариант:

gulp.src('some/path/**/js/*.js', {base:'.'}) 
    .pipe(gulp.dest('output')); 

Теперь some/path/ не будут вырезаны из ваших путей к файлам, что приводит к следующей структуре папок в output:

output/some/path/example/app/js/app.js 
output/some/path/example/vendor/js/vendor.js 
output/some/path/example/vendor/lib/js/lib.js 

EDIT: Если вы передадите массив узоров на номер gulp.src(), то нет способа указать другие base для каждого из элементов массива. Это, например, не работы:

gulp.src(
    ['source1/examples/**/*.html', 
    'source2/examples/**/*.html'], 
    { base: ['source1/', // Doesn't work. 
      'source2/']} // Needs to be a string. 
).pipe(gulp.dest('dist')); 

Вместо этого вы должны следовать "Using multiple sources in one task" recipe. Это позволяет объединить два потока, каждый из которых может получить свой собственный вариант base:

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

gulp.task('default', function() { 
    merge(gulp.src('source1/examples/**/*.html', {base: 'source1/'}), 
     gulp.src('source2/examples/**/*.html', {base: 'source2/'})) 
    .pipe(gulp.dest('dist')); 
}); 
+1

10x. Знаете ли вы, что, если я хочу указать различные базовые пути для разных шаблонов глобалов (заданных в массиве)? например если у меня есть ['source1/examples/**/*. html', 'source2/examples/**/*. html'], и я хочу объединить все примеры в одну папку '/ dist/examples /' ? – epeleg

+2

См. Мое редактирование выше. –

+0

Существуют ли какие-либо особые аспекты этого, когда исходные файлы находятся в папке «../somefolder/» (т. Е. Папке для сестер) и dest должны находиться в папке ./dest/subfolder? – epeleg

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