Як скопіювати каталоги рекурсивно за допомогою gulp?


167

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

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

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

Gulp здається чудовим інструментом збирання, але копіювання елементів має бути напевно простим процесом?


9
Будь-який новий глядач, який читає це запитання, слід зазначити, що відповідь, що найбільше голосує, не допомагає вирішити оригінальну специфікацію запитання про несполучені каталоги. Це вирішує проблеми людей , що мають з не всі файли всередині директорії від копіювання, так що це корисно!
M1ke

1
Якщо ви не згладжуєтесь, ви маєте на увазі, що ви хочете, щоб каталоги 'css', 'js' та 'src' були присутніми /var/www/? Можна спробувати{css,js,src}/**/*
Джейсон Гімаат

Я знаю, що глобальне розширення працює всередині gulp, але я був би збентежений, якби це працювало по-різному до кожного елемента як окремої рядки у списку - оскільки розширення на глобальному рівні в основному призначене для розширення до списку перед виконанням.
M1ke

Відповіді:


319

Наступні дії не згладжують структуру папки:

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

'**/*'Є важливою частиною. Цей вираз - це глобус, який є потужним інструментом вибору файлів. Наприклад, для копіювання лише файлів .js використовується:'input/folder/**/*.js'


2
думаю, ти забув додати gulp.dest. Повинно бути.pipe(gulp.dest('output/folder'));
Метью Шпонкле

3
Як це зробити з конкретним розширенням файлу?
Шев

1
Чи можете ви відредагувати відповідь, щоб надати приклад для оригінального набору файлів? Я НЕ впевнений , як це більш доречно , але я б з задоволенням подивився на те, як він працює по порівнянні з {base:"."}методом.
М1ке

2
Важливо зазначити, що за baseзамовчуванням є "папка", як зазначено в цій відповіді. Іншими словами, основа починається там, де починається глобальний візерунок. Це допомогло мені зрозуміти , де мої файли будуть в кінцевому підсумку , а також , чому вам не потрібен **/*в gulp.destпараметрі. Gulp приймає все в глобусі і ставить його в папку dest з тією ж структурою.
Ніл Монро

3
Це не відповідає в повній мірі на запитання. Це приємне рішення, як правильно копіювати рекурсивно, але не відповідає, як змінити базовий каталог.
ty1824

173

Виявляється, що для копіювання повної структури каталогу gulpпотрібно забезпечити базу для вашого gulp.src()методу.

Тому gulp.src( [ files ], { "base" : "." })можна використовувати в структурі вище для копіювання всіх каталогів рекурсивно.

Якщо ви, як і я, можете забути це, то спробуйте:

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

1
Додайте конфігурацію "cwd", щоб встановити поточну робочу директорію.
Skarllot

3
Якщо baseвас все ще бентежить, погляньте на stackoverflow.com/a/35848322/11912, який чудово допомагає пояснити це.
Джеймс Скемп

60

Отже - рішення надання базової роботи з огляду на те, що всі шляхи мають однаковий базовий шлях. Але якщо ви хочете надати різні базові шляхи, це все одно не вийде.

Один із способів я вирішив цю проблему - зробивши початок шляху відносним. Для вашого випадку:

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

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

Це працює лише в тому випадку, якщо ви можете переконатися, що структура вашої папки не матиме певних шляхів, які можуть збігатися двічі. Наприклад, якби ви були randomjs/на тому ж рівні js, що і ви, ви б відповідали обом.

Це єдиний спосіб, який я знайшов, щоб включити їх до складу функції вищого рівня gulp.src. Можливо, було б просто створити плагін / функцію, яка могла б відокремити кожен із цих глобусів, щоб ви могли вказати базовий каталог для них.


Я думаю, що почати з декількох базових шляхів, ймовірно, виходить за рамки питання. З мого початкового запитання я переміщував файли до абсолютного шляху, але проблема все-таки виникла, що не вказуючи базу, всі файли з усіх моїх глобусів були скопійовані в єдиний каталог без дотримання їх існуючої ієрархії.
M1ke

2
@ M1ke Це правда, головний пункт вашого питання не був спрямований на різні базові шляхи. Однак ви згадали However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www, і саме таким чином я знайшов ваше запитання - я шукав рішення, як скопіювати рекурсивно з різних базових контурів. По суті, це рішення працює у вашому випадку без необхідності вказувати базову за замовчуванням, але також і для випадку багатоповерхового шляху, якщо ви можете переконатися, що провідна зірка нічого не відповідає :)
ty1824

6
Ця відповідь є винятковою. Це стосується конкретно копіювання шляху з довільної початкової точки, наприклад. src може 'assets/subdir/*fonts/*'скопіювати dir шрифтів.
Wtower

-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.

Пов’язані посилання:

  1. використання xcopy

  2. gulp-exec і gulp-run


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