Ищете способ скопировать файлы в 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

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);
Кирк Строубек
источник
2
Хммм ... мой глоток говорит, что эта задача завершена, но выходной файл не существует.
Tyguy7,
4
Вы должны вернуть поток, чтобы сообщить Gulp о завершении задачи.
Merott
2
Я не понимаю, почему ответ, который говорит «не ответ», имеет больше голосов, чем принятый ответ, который действительно отвечает на вопрос. Я не уверен, что мы должны загромождать SO ответами, предназначенными для того, чтобы поисковые системы выполняли какие-то конкретные действия, а не давали ответы на вопрос. Я думаю, что работа поисковых систем - делать что-то полезное из того, что они получают при сканировании сайта. Только мои 0,02 доллара
jinglesthula
9
@jinglesthula. Это полезный сервис для тех, кто задает этот вопрос через поисковые системы, независимо от того, насколько хорошо поисковая система выполняет свою работу. Я ценю это.
jbkly
1
хаха только что понял, что это более популярно, чем правильный вопрос или правильный ответ: П
Кирк Строубек
5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Сработало у меня!

user2977367
источник
.. даже до сих пор, это является ответом.
Кирк Строубек, 02
2
... так что кто - то может переписать это так же работа , как есть, так что люди приходят на эту страницу ищет, что точный фрагмент кода может реально использовать его?
Иван Дерст
Итак ... разрешены ли скобки и $ n "обратные ссылки" в глобах src / dest? Это не регулярные выражения, ага. Это похоже на то, что я ищу, но в документации по 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_FOLDER + '/**/*.js').

Другие ответы не сработали для меня (например, использование base:on src()}, потому что некоторые плагины сглаживают дерево каталогов.

Brnmonteiro
источник
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/')),
)
);
Дэн Альботяну
источник