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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

Если вы хотите скопировать все содержимое папки рекурсивно в другую папку, вы можете выполнить следующую команду windows из gulp:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

Опция /y в конце - это подавление сообщения подтверждения перезаписи.

В Linux вы можете выполнить следующую команду из gulp:

cp -R /path/to/srcfolder /path/to/destfolder

вы можете использовать плагин gulp -exec или gulp -run для выполнения системных команд из gulp.

Ссылки по теме: