Gunakan gulp untuk memilih dan memindahkan direktori dan filenya

98

Saat ini saya menggunakan gulp untuk memanggil skrip bash yang membersihkan dist/direktori saya dan memindahkan file yang sesuai ke direktori bersih. Saya ingin ini dilakukan dengan gulp karena saya tidak yakin skrip akan berfungsi pada sistem file non * nix.
Sejauh ini, saya menggunakan modul gulp-clean untuk membersihkan dist/direktori tetapi ketika saya mencoba memindahkan direktori yang diperlukan dan file mereka ke folder dist, direktori tersebut kosong.

var gulp = require('gulp'),
    clean = require('gulp-clean');

gulp.task('clean', function(){
  return gulp.src(['dist/*'], {read:false})
  .pipe(clean());
});

gulp.task('move',['clean'], function(){
  gulp.src(['_locales', 'icons', 'src/page_action', 'manifest.json'])
  .pipe(gulp.dest('dist'));
});

gulp.task('dist', ['move']);

memanggil gulp disthasil di dist/direktori yang diisi dengan direktori yang benar tetapi semuanya kosong

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

Bagaimana cara menyalin direktori dan isinya ke dist/folder?

makenova
sumber

Jawaban:

162

Anda perlu menyertakan baseopsi ke src, yang akan mempertahankan struktur file seperti yang Anda inginkan:

var filesToMove = [
        './_locales/**/*.*',
        './icons/**/*.*',
        './src/page_action/**/*.*',
        './manifest.json'
    ];

gulp.task('move',['clean'], function(){
  // the base option sets the relative root for the set of files,
  // preserving the folder structure
  gulp.src(filesToMove, { base: './' })
  .pipe(gulp.dest('dist'));
});

Selain itu, Anda mungkin akan mengalami masalah di kemudian hari jika Anda memiliki semua file sumber ini di root proyek Anda.

Jika Anda bisa, saya sarankan Anda menggunakan satu src/folder dan memindahkan semua file khusus aplikasi Anda ke sana. Hal ini membuat pemeliharaan lebih mudah untuk dilakukan, dan mencegah file khusus build Anda tercampur dengan file khusus aplikasi Anda.

Jika Anda melakukan ini, maka cukup ganti semua kemunculan ./dengan src/pada contoh di atas.

Terlalu bersemangat
sumber
1
Bekerja dengan sempurna hanya setelah mengatur ulang file tetapi alasan Anda masuk akal jadi saya menandai jawaban Anda sebagai benar. Terima kasih.
makenova
2
Untuk melakukan sebaliknya, gunakan gulp-flatten. stackoverflow.com/questions/21153338/…
Tony Gutierrez
2
Sebagai catatan untuk siapa pun yang melakukan ini, pastikan Anda tidak memiliki readopsi di src yang disetel ke false(ini disetel ke truedefault).
yndolok
3
Ketika saya melakukan ini, itu menyalin dengan seluruh direktori root.
Nomadme
5

Pertanyaan asli hanya menargetkan direktori (alias folder) di dalamnya gulp.src, yaitu gulp.src(['_locales', ...dalam contoh ini, _localesadalah nama direktori .

Jawaban yang diterima menggunakan globpola di nya gulp.srcuntuk menargetkan file di mana saja di direktori tersebut, yaitu gulp.src(['./_locales/**/*.*', ..., (pemberitahuan double-tanda bintang , dan filename.extension tanda bintang). Jawaban yang diterima berhasil ...

... tetapi jawaban yang diterima hanya menekankan baseopsi :

Anda perlu memasukkan baseopsi ke src ...

Saya bereksperimen dan menemukan:

  1. Sebenarnya, tidak perlu menggunakan baseopsi untuk mencapai apa yang diminta OP: "... dan memindahkan file yang sesuai ke direktori bersih." The basepilihan apakah memang melestarikan berkas + folder struktur (seperti yang dijelaskan dalam jawaban diterima), tetapi basepilihan adalah tidak cukup untuk memindahkan file sebagai OP bertanya . Mempertahankan struktur folder + file mungkin adalah apa yang diharapkan OP , jadi jawaban yang diterima bagus, tapi ...

  2. Hanya untuk mengulangi apa yang memindahkan file, itu adalah globpola:

    1. Tanda bintang ganda ( .../**/...) menelusuri secara rekursif di semua subfolder, dan 'subfolder' subfolder, dll.

    2. Filename.extension asterisks ( .../*.*) menemukan file dari semua nama , dan semua ekstensi . Jadi menurut saya bagian ini paling perlu mendapat penekanan!

  3. Jawaban yang diterima mengubah sesuatu yang lain; itu menambahkan awalan ./ke setiap argumen jalur yang diteruskan ke gulp.src. Saya pikir itu tidak perlu / berlebihan; jika tidak ada ./, (seperti dalam pertanyaan OP), jalur diselesaikan relatif terhadap direktori saat ini - menghasilkan perilaku yang sama . Tapi mungkin praktik yang baik untuk menjelaskan dengan./

Beri tahu saya jika saya salah ...

Kacang Merah
sumber