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

В настоящее время я использую gulp для вызова bash script, который очищает мой каталог dist/ и перемещает соответствующие файлы в чистый каталог. Я хотел бы, чтобы это выполнялось с помощью gulp, потому что я не уверен, что script будет работать с файловой системой non * 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/?

Ответ 1

Вам нужно включить опцию 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/ в примере выше.

Ответ 2

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

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

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

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

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

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

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

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

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

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

Дайте мне знать, если я ошибаюсь...