Шукається спосіб копіювання файлів у gulp та перейменування на основі батьківського каталогу


91

Для кожного модуля у мене є кілька файлів, які потрібно скопіювати до каталогу збірки, і я шукаю спосіб мінімізувати повторюваний код із цього:

gulp.src('./client/src/modules/signup/index.js')
  .pipe(gulp.dest('./build/public/js/signup'));

gulp.src('./client/src/modules/admin/index.js')
  .pipe(gulp.dest('./build/public/js/admin'));

приблизно до цього:

gulp.src('./client/src/modules/(.*)/index.js')
  .pipe(gulp.dest('./build/public/js/$1'));

Очевидно, що вищесказане не працює, то чи є спосіб зробити це, або npm, який це вже робить?

Дякую

Відповіді:


131

Найкращий спосіб - це налаштувати ваш файл baseпід час пошуку файлів, наприклад:

gulp.src('./client/src/modules/**/index.js', {base: './client/src/modules'})
  .pipe(gulp.dest('./build/public/js/'));

Це говорить gulpпро використання каталогу модулів як вихідної точки для визначення відносних шляхів.

(Крім того, ви можете використовувати, /**/*.jsякщо хочете включити всі файли JS ...)


6
Це повинен бути більш динамічний спосіб - як щодо того, коли файли src надходять з двох різних каталогів, і ви хочете зберегти їх каталоги у dest?
Іван Дурст

1
@IvanDurst Я керував цим конкретним випадком за допомогою коду OP (відповіді). використання базової конфігурації та використання відносного шляху від файлу gulp до незалежних файлів та ./folder-example/**повних папок та файлів.
Кайо Вільсон

210

Не відповідь, але застосовна до появи цього запитання в результатах пошуку.

Щоб скопіювати файли / папки залпом

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);

2
Гммм ... моя глотка каже, що це завдання виконано, але вихідний файл не існує.
Tyguy7,

4
Ви повинні повернути потік, щоб повідомити Gulp, коли завдання закінчиться.
Меротт

2
Мене бентежить, чому відповідь, яка говорить "не відповідь", має більше голосів, ніж прийнята відповідь, яка відповідає на питання. Я не впевнений, що ми повинні загромоджувати ТАК відповідями, призначеними для того, щоб пошукові системи робили певну справу, на відміну від надання відповідей на запитання. Я думаю, що робота пошукових систем - зробити щось корисне з того, що вони отримують, скануючи сайт. Тільки мої $ 0,02
jinglesthula

9
@jinglesthula Це корисна послуга для тих, хто приходить до цього питання через пошукові системи, незалежно від того, наскільки добре пошукова машина виконує свою роботу. Я це ціную.
jbkly

1
ха-ха щойно зрозумів, що це популярніше, ніж правильне запитання чи правильна відповідь: P
Kirk Strobeck

5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Працював у мене!


.. навіть до сих пір, це є відповіддю.
Kirk Strobeck 02.03.14

2
... так що хто - то може переписати це так само робота , як є, так що люди приходять на цю сторінку шукає, що точний фрагмент коду може реально використовувати його?
Іван Дурст

Отже ... чи дозволені парени та $ n "зворотні посилання" у глобусах src / dest? Вони не регулярні вирази, afaik. Це схоже на те, що я шукаю, але документи vinyl-fs досить стислі щодо варіантів .src () та .dest (), а також про те, що в них дозволено та як вони працюють.
jinglesthula

3

Використання для збереження вхідного дерева каталогів буде збережено.

.pipe(gulp.dest(function(file) {
    var src = path.resolve(SRC_FOLDER);
    var final_dist = file.base.replace(src, '');
    return DIST_FOLDER + final_dist;
}))

Використовуючи це, ви можете помістити в src: .src(SRC_FOLDER + '/**/*.js') .

Інші відповіді для мене не працювали (наприклад, використання base:on src()}, оскільки деякі плагіни вирівнюють дерево каталогів.


0

копіювати файли паралельно

gulp.task('copy', gulp.parallel(
() =>  gulp.src('*.json').pipe(gulp.dest('build/')),
() =>  gulp.src('*.ico').pipe(gulp.dest('build/')),
() =>  gulp.src('img/**/*').pipe(gulp.dest('build/img/')),
)
);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.