Как параметр базы влияет на gulp.src & gulp.dest

У меня возникла проблема с копированием набора файлов, и при вызове .dest( "некоторая папка" ) вся структура папок была потеряна.

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

Документация для gulp.src options говорит только о том, что ее параметры:

Параметры для перехода к node -glob через glob-поток.

Заглядывая в node -главная документация для своих опций база там вообще не указана.
И документация по файлам глобуса указывает только, что

"Значение по умолчанию - это все до начала шара (см. glob-parent)"

Так что тоже не помогайте.

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

Ответ 1

(Вы не смотрите на официальной документации глотком. Http://github.com/arvindr21/gulp просто какой - то парень вилка gulpjs GitHub репо. Официальный репо http://github.com/gulpjs/gulp/ где базовый вариант действительно задокументирован.)

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

Если вы не укажете base параметр самостоятельно, то все, что находится перед первым gulp.src() в ваших 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() в вашем 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

РЕДАКТИРОВАТЬ: Если вы передаете массив шаблонов в 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'));

Вместо этого вы должны следовать рецепту "Использование нескольких источников в одной задаче". Это позволяет объединить два потока, каждый из которых может получить свою собственную 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'));
});