Szukam sposobu na kopiowanie plików w gulp i zmianę nazwy na podstawie katalogu nadrzędnego

91

Dla każdego modułu mam kilka plików, które należy skopiować do katalogu kompilacji i szukam sposobu na zminimalizowanie powtarzającego się kodu z tego:

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'));

do czegoś takiego:

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

Oczywiście powyższe nie działa, więc czy jest na to sposób lub npm, który już to robi?

Dzięki

chris
źródło

Odpowiedzi:

131

Najlepszym sposobem jest skonfigurowanie basepodczas pozyskiwania plików, na przykład:

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

To mówi, gulpaby użyć katalogu modułów jako punktu początkowego do określania ścieżek względnych.

(Możesz również użyć, /**/*.jsjeśli chcesz dołączyć wszystkie pliki JS ...)

OverZealous
źródło
6
Musi istnieć bardziej dynamiczny sposób na zrobienie tego - co w przypadku, gdy pliki src pochodzą z 2 różnych katalogów i chcesz zachować ich katalogi w dest?
Ivan Durst
1
@IvanDurst Zarządzałem tym konkretnym przypadkiem za pomocą kodu OP (odpowiedzi). używając podstawowej konfiguracji i używając względnej ścieżki z pliku gulp do niezależnych plików oraz ./folder-example/**pełnych folderów i plików.
Caio Wilson
210

Brak odpowiedzi, ale zastosowanie do pojawiania się tego pytania w wynikach wyszukiwania.

Aby skopiować pliki / foldery w gulp

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);
Kirk Strobeck
źródło
2
Hmmm ... mój łyk mówi, że to zadanie zostało zakończone, ale plik wyjściowy nie istnieje.
Tyguy7
4
Musisz zwrócić strumień, aby powiadomić Gulp o zakończeniu zadania.
Merott
2
Nie wiem, dlaczego odpowiedź, która mówi „nie odpowiada”, ma więcej głosów pozytywnych niż zaakceptowana odpowiedź, która odpowiada na pytanie. Nie jestem pewien, czy powinniśmy zaśmiecać SO odpowiedziami zaprojektowanymi tak, aby wyszukiwarki robiły coś konkretnego, zamiast udzielać odpowiedzi na pytanie. Myślę, że zadaniem wyszukiwarek jest zrobienie czegoś użytecznego z tego, co dostają, gdy indeksują witrynę. Tylko moje 0,02 $
jinglesthula
9
@jinglesthula To przydatna usługa dla tych, którzy zadają to pytanie za pośrednictwem wyszukiwarek, niezależnie od tego, jak dobrze wyszukiwarka wykonuje swoją pracę. Doceniam to.
jbkly
1
haha właśnie zdałem sobie sprawę, że to jest bardziej popularne niż właściwe pytanie lub prawidłowa odpowiedź: P
Kirk Strobeck
5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Pracował dla mnie!

user2977367
źródło
.. nawet nadal, to jest odpowiedź.
Kirk Strobeck
2
... więc może ktoś przerobić go tak, że nie działają jak jest, więc ludzie przybywający do tej strony patrząc na ten dokładnym fragmentu kodu może faktycznie go używać?
Ivan Durst
Więc ... czy parens i $ n "backreferences" są dozwolone w src / dest globs? To nie są wyrażenia regularne, afaik. Wygląda na to, czego szukam, ale dokumentacja vinyl-fs jest raczej zwięzła na temat opcji .src () i .dest () oraz tego, co jest w nich dozwolone i jak działają.
jinglesthula
3

Użyj do zachowania drzewa katalogów wejściowych, które zostaną zachowane.

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

Korzystanie z tym, można umieścić w src: .src(SRC_FOLDER + '/**/*.js').

Inne odpowiedzi nie zadziałały dla mnie (jak przy użyciu base:on src()}, ponieważ niektóre wtyczki spłaszczają drzewo katalogów.

brnmonteiro
źródło
0

kopiować pliki równolegle

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/')),
)
);
Dan Alboteanu
źródło