it-swarm.com.ru

Как рекурсивно копировать каталоги с помощью gulp?

Я пытаюсь организовать проект из рабочей директории на сервер (на той же машине). Используя следующий код:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

Я ожидаю увидеть все скопированные файлы. Однако это выравнивает структуру dir - все каталоги копируются, но каждый файл помещается в корень /var/www

Gulp кажется отличным инструментом для сборки, но копирование элементов должно быть простым процессом?

156
M1ke

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

Таким образом, gulp.src( [ files ], { "base" : "." }) может использоваться в приведенной выше структуре для рекурсивного копирования всех каталогов.

Если, как и я, вы можете забыть об этом, попробуйте:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};
164
M1ke

Следующее работает без выравнивания структуры папок:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

'**/*' является важной частью. Это выражение glob , которое является мощным инструментом выбора файлов. Например, для копирования только файлов .js используйте: 'input/folder/**/*.js'

294
cancerbero

Итак, решение обеспечения базы работает, учитывая, что все пути имеют одинаковый базовый путь. Но если вы хотите указать разные базовые пути, это все равно не сработает.

Одним из способов решения этой проблемы было создание относительного начала пути. Для вашего случая:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

Причина, по которой это работает, заключается в том, что Gulp устанавливает основание как конец первого явного чанка - ведущий * заставляет его устанавливать основание на cwd (что является результатом, которого мы все хотим!)

Это работает, только если вы можете убедиться, что в структуре вашей папки не будет определенных путей, которые могут совпадать дважды. Например, если бы у вас был randomjs/ на том же уровне, что и js, вы бы в итоге совпали с обоими.

Это единственный способ включить их как часть функции gulp.src верхнего уровня. Вероятно, было бы просто создать плагин/функцию, которая могла бы выделить каждый из этих глобусов, чтобы вы могли указать для них базовый каталог.

54
ty1824