Використовуйте gulp для вибору та переміщення каталогів та їх файлів


98

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

2
Для того, щоб зробити навпаки, використовуйте глотком-сплющуванням. 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варіант, щоб досягти того, про що попросив ОП: "... і переміщує відповідні файли до чистого каталогу". baseВаріант робить дійсно зберегти папку + файл структури (як описано в загальноприйнятому відповіді), але baseваріант мало , щоб перемістити файли в ОП запитав . Збереження структури папки + файлів - це, мабуть, те, на що очікує ОП , тому прийнята відповідь хороша, але ...

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

    1. Швидкий .../**/...пошук зірочкою ( ) здійснює рекурсивний пошук у всіх підпапках, а в підпапках - підпапках тощо.

    2. Зірочками filename.extension ( .../*.*) знаходять файли всіх імен та всіх розширень . Тож я вважаю, що ця частина заслуговує на найбільшу увагу!

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

Повідомте мене, якщо я помиляюся ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.