Mencari cara untuk menyalin file dalam gulp dan mengganti nama berdasarkan direktori induk

91

Untuk setiap modul, saya memiliki beberapa file yang perlu disalin ke direktori build, dan saya sedang mencari cara untuk meminimalkan pengulangan kode dari ini:

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

menjadi seperti ini:

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

Jelas hal di atas tidak berfungsi, jadi apakah ada cara untuk melakukan ini, atau npm yang sudah melakukan ini?

Terima kasih

chris
sumber

Jawaban:

131

Cara terbaik adalah mengonfigurasi basekapan Anda mencari file, seperti:

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

Ini memberitahu gulpuntuk menggunakan direktori modul sebagai titik awal untuk menentukan jalur relatif.

(Juga, Anda dapat menggunakan /**/*.jsjika Anda ingin menyertakan semua file JS ...)

Terlalu bersemangat
sumber
6
Harus ada cara yang lebih dinamis untuk melakukan ini - bagaimana jika file src berasal dari 2 direktori berbeda dan Anda ingin menyimpan direktorinya di dest?
Ivan Durst
1
@IvanDurst Saya mengelola kasus khusus ini dengan kode OP (jawaban). menggunakan konfigurasi dasar dan menggunakan jalur relatif dari file gulp ke file independen serta ./folder-example/**folder dan file lengkap.
Caio Wilson
210

Bukan jawabannya, tapi berlaku untuk penampilan pertanyaan ini di hasil pencarian.

Untuk menyalin file / folder dalam gulp

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);
Kirk Strobeck
sumber
2
Hmmm ... saya teguk mengatakan tugas ini selesai, tetapi file keluaran tidak ada.
Tyguy7
4
Anda harus mengembalikan arus untuk memberi tahu Gulp saat tugas selesai.
Merott
2
Saya bingung mengapa jawaban yang mengatakan "bukan jawaban" memiliki lebih banyak suara positif daripada jawaban yang diterima yang menjawab pertanyaan itu. Saya tidak yakin kita harus mengacaukan SO dengan jawaban yang dirancang untuk membuat mesin pencari melakukan beberapa hal tertentu daripada memberikan jawaban atas pertanyaan tersebut. Saya pikir itu tugas mesin pencari untuk membuat sesuatu yang berguna dari apa yang mereka dapatkan ketika mereka merayapi situs. Hanya $ 0,02 saya
jinglesthula
9
@jinglesthula Ini adalah layanan yang berguna bagi mereka yang sampai pada pertanyaan ini melalui mesin pencari, terlepas dari seberapa baik mesin pencari melakukan tugasnya. Saya menghargainya.
jbkly
1
haha baru menyadari ini lebih populer daripada pertanyaan yang benar atau jawaban yang benar: P
Kirk Strobeck
5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Bekerja untuk saya!

pengguna2977367
sumber
.. bahkan masih, ini adalah jawabannya.
Kirk Strobeck
2
... jadi bisa seseorang menulis ulang sehingga tidak bekerja sebagaimana mestinya, sehingga orang yang datang ke halaman ini mencari yang potongan yang tepat dari kode dapat benar-benar menggunakannya?
Ivan Durst
Jadi ... apakah tanda kurung dan $ n "referensi latar" diperbolehkan di src / dest globs? Mereka bukan regex, afaik. Ini terlihat seperti yang saya cari tetapi dokumen vinyl-fs agak sempit pada opsi .src () dan .dest () dan apa yang diperbolehkan di dalamnya dan bagaimana mereka bekerja.
jinglesthula
3

Gunakan untuk melestarikan pohon direktori masukan akan dipertahankan.

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

Dengan ini, Anda dapat dimasukkan ke dalam src: .src(SRC_FOLDER + '/**/*.js').

Jawaban lain tidak berhasil untuk saya (seperti menggunakan base:on src()}, karena beberapa plugin meratakan pohon direktori.

brnmonteiro
sumber
0

salin file secara paralel

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
sumber