Як скопіювати каталоги рекурсивно за допомогою 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.