Используйте gulp для выбора и перемещения каталогов и их файлов


98

В настоящее время я использую gulp для вызова сценария bash, который очищает мой dist/каталог и перемещает соответствующие файлы в чистый каталог. Я бы хотел, чтобы это было сделано с помощью gulp, потому что я не уверен, что сценарий будет работать в файловой системе, отличной от * nix.
Пока я использую модуль gulp-clean для очистки dist/каталога, но когда я пытаюсь переместить требуемые каталоги и их файлы в папку dist, каталоги пусты.

var gulp = require('gulp'),
    clean = require('gulp-clean');

gulp.task('clean', function(){
  return gulp.src(['dist/*'], {read:false})
  .pipe(clean());
});

gulp.task('move',['clean'], function(){
  gulp.src(['_locales', 'icons', 'src/page_action', 'manifest.json'])
  .pipe(gulp.dest('dist'));
});

gulp.task('dist', ['move']);

вызов gulp distприводит к тому, что dist/каталог заполняется правильными каталогами, но все они пусты

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

Как мне скопировать каталоги и их содержимое в dist/папку?

Ответы:


162

Вам необходимо включить baseпараметр src, который сохранит структуру файла так, как вы хотите:

var filesToMove = [
        './_locales/**/*.*',
        './icons/**/*.*',
        './src/page_action/**/*.*',
        './manifest.json'
    ];

gulp.task('move',['clean'], function(){
  // the base option sets the relative root for the set of files,
  // preserving the folder structure
  gulp.src(filesToMove, { base: './' })
  .pipe(gulp.dest('dist'));
});

Кроме того, у вас, вероятно, возникнут проблемы в будущем, если у вас есть все эти исходные файлы в корне вашего проекта.

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

Если вы сделаете это, то просто заменить все вхождения ./с src/в приведенном выше примере.


1
Работает отлично только после реорганизации файлов, но ваши рассуждения разумны, поэтому я отмечаю ваш ответ как правильный. Спасибо.
makenova 05

2
Чтобы сделать наоборот, используйте gulp-flatten. stackoverflow.com/questions/21153338/…
Тони Гутьеррес,

2
В качестве примечания для всех, кто это сделал, убедитесь, что у вас нет readопции в src, установленной на false(она установлена trueпо умолчанию).
yndolok

3
Когда я это делаю, он копирует все корневые каталоги.
Nomadme

5

Исходный вопрос нацелен только на каталоги (также известные как папки) gulp.src, то есть gulp.src(['_locales', ...в этом примере _localesэто имя каталога .

Принятый ответ использует globшаблон в своем gulp.srcцелевые файлы в любом месте в этих каталогах, то есть gulp.src(['./_locales/**/*.*', ..., (обратите внимание на двойных звездочках , и filename.extension звездочек). Принятый ответ работает ...

... но принятый ответ только подчеркивает baseвариант :

Вам нужно включить baseпараметр в src ...

Я экспериментировал и обнаружил:

  1. Строго говоря, нет необходимости использовать baseопцию для достижения того, что запросил OP: «... и перемещает соответствующие файлы в чистый каталог». baseВариант делает действительно сохранить папку + файл структуры (как описано в общепринятом ответа), но baseвариант не достаточно , чтобы переместить файлы в ОП спросил . Сохранение структуры папки + файла, вероятно, ожидает OP , поэтому принятый ответ хорош, но ...

  2. Просто чтобы подтвердить то , что делает перемещение файлов, это globмодель:

    1. Двойная звездочка ( .../**/...) выполняет рекурсивный поиск по всем подпапкам, подпапкам, подпапкам и т. Д.

    2. Filename.extension asterisks ( .../*.*) находит файлы со всеми именами и всеми расширениями . Так что я думаю, что эта часть заслуживает особого внимания!

  3. Принятый ответ меняет кое-что еще; он добавляет префикс ./к каждому переданному аргументу пути gulp.src. Я считаю это ненужным / избыточным; если нет ./(как в вопросе OP), пути разрешаются относительно текущего каталога, что приводит к тому же поведению . Но, возможно, это хорошая практика - четко указывать./

Сообщите мне, если я ошибаюсь ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.