Salin semua file dari direktori ke direktori lain dengan salinan Grunt.js.

91

Saya mencoba menyalin semua file dalam direktori ke direktori lain sebagai bagian dari proses pembuatan saya. Ini berfungsi dengan baik untuk file individual yang saya tentukan secara eksplisit tetapi ketika saya mencoba menyalin seluruh direktori, itu melakukan hal-hal aneh seperti menyalin struktur direktori lengkap (atau tidak sama sekali). Berikut adalah bagian yang relevan dari GruntFile.js saya:

copy: {
  myvoice: {
    files: [
      { src:"src/html/index.html", dest:"dist/myvoice/index.html" },
      { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" },
      { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" },
      { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" },
      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
    ]
  }
},

Secara khusus itu adalah baris terakhir yang saya tidak bisa mulai bekerja:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
Evan Hobbs
sumber

Jawaban:

150

The flatten: truepilihan karena di jawaban ini mungkin bekerja untuk beberapa kasus, tetapi tampaknya bagi saya bahwa persyaratan lebih umum (seperti dalam kasus saya) adalah untuk menyalin folder dan struktur sub-folder nya, as-adalah, untuk dest. Tampaknya dalam banyak kasus jika Anda memiliki sub-folder, mereka mungkin direferensikan dengan cara itu dalam kode. Kunci untuk melakukan ini adalah cwdopsi, yang akan mempertahankan struktur folder relatif terhadap direktori kerja yang ditentukan:

copy: {
  files: {
    cwd: 'path/to/files',  // set working folder / root to copy
    src: '**/*',           // copy all files and subfolders
    dest: 'dist/files',    // destination folder
    expand: true           // required when using cwd
  }
}
Brian Moeskau
sumber
Terima kasih - Anda benar jawaban ini lebih dari apa yang saya cari ketika saya mengajukan pertanyaan. Saya telah belajar untuk menangani perataan yang disebabkan oleh jawaban sebelumnya tetapi itu menjengkelkan.
Evan Hobbs
14
Saya telah kehilangan lebih dari satu jam untuk ini ... Jika Anda menggunakan cwdopsi, pastikan untuk berbalik expand:true. Jika Anda tidak menyetelnya expand:true, cwd tidak akan bekerja dengan baik.
ducin
2
Saya harus memastikan jalur direktori diakhiri dengan '/' dan menambahkan flatten: falseagar ini berfungsi.
Samuel Rossille
**/* Itulah yang saya cari yang saya gunakan ** terima kasih man.
Sam
43

Tugas ini akan mempertahankan struktur folder jika Anda menentukan file glob. Yang Anda inginkan adalah flattenopsi yang akan menghapus struktur.

{
    expand: true,
    flatten: true,
    src: ['src/html/css/fonts/**'],
    dest: 'dist/myvoice/css/fonts/',
    filter: 'isFile'
}

Temukan opsi lain yang tersedia di repo Github . Semoga ini membantu.

Ben
sumber
25

Saya ingin menambahkan bahwa mengubah format glob in src akan mengubah cara kerja salinan.

Seperti yang ditunjukkan oleh bmoeskau di atas, berikut ini akan menyalin semua yang ada di dalamnya dist/dan memindahkannya ke path/to/dir(menimpa tujuan jika sudah ada).

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '**'
  }
}

Namun perlu dicatat, bahwa:

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  }
}

Hanya akan menyalin file di dalam dist/serta direktori, tetapi tidak akan menyalin isi direktori tersebut ke tujuan.

Juga, berikut dengan hanyasrc: '*/*' akan menyalin direktori dengan konten di dalamnya . Artinya, file di dalamnya tidak akan disalin.dist/dist/

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*'
  }
}

Akhirnya, sama seperti di atas, tetapi hanyasrc: '**/**' akan menyalin file di dalam serta file di dalam subdirektori ke . Jadi tidak akan ada folder di dalam tujuan.dist/dist/path/to/dir

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}
Jorge Bucaran
sumber
4
penjelasan yang bagus! +1
myrocode
3
lebih baik daripada dokumentasi di github, saya suka contoh
wukong
+1 Apakah ada kesepakatan tentang arti jumlah bintang, misalnya apakah **selalu berarti file dan direktori, dan *hanya file?
CodyBugstein
1
@Imray Dari manual bash : dua *s yang berdekatan digunakan sebagai pola tunggal akan cocok dengan semua file dan nol atau lebih direktori dan subdirektori . Jika diikuti oleh a /, dua *s yang berdekatan hanya akan cocok dengan direktori dan subdirektori .
Jorge Bucaran
1
**cocok dengan semuanya , sedangkan **/ hanya direktori dan subdirektori (bukan file).
Jorge Bucaran
2

Harus menggunakan egdy sebagai gantinya kurung kurawal untuk segmen file (dalam Coffeescript) ...

copy: {
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]
}
Saschlong
sumber
0

Jika Anda mengembangkan dengan angular yeoman, maka ini adalah cara yang lebih baik untuk menyalin dengan grunt. expand: true diperlukan saat menggunakan cwd. <% = yeoman.app%> hanyalah rute aplikasi ('.').

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }
LearnToday
sumber
Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, menyertakan penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda. Harap juga mencoba untuk tidak membanjiri kode Anda dengan komentar penjelasan, karena ini mengurangi keterbacaan kode dan penjelasannya!
Selamat tinggal StackExchange