Grunt.js kopyasıyla tüm dosyaları dizinden diğerine kopyalayın


91

Oluşturma sürecimin bir parçası olarak bir dizindeki tüm dosyaları başka bir dizine kopyalamaya çalışıyorum. Açıkça belirttiğim tek tek dosyalar için iyi çalışıyor, ancak tüm dizini kopyalamaya çalıştığımda, tüm dizin yapısını kopyalamak gibi garip şeyler yapıyor (veya hiç yok). GruntFile.js dosyamdaki ilgili kısım:

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/" }
    ]
  }
},

Özellikle işe koyamadığım son satır:

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

Yanıtlar:


151

flatten: trueGibi seçenek bu cevap bazı durumlarda işe yarayabilir, ancak olduğu gibi o kadar, daha yaygın ihtiyacı (benim durumumda olduğu gibi) bir klasör ve alt klasör yapısını kopyalamak için geliyor bana dest. Görünüşe göre çoğu durumda alt klasörleriniz varsa, bunlara muhtemelen kodda bu şekilde başvuruluyor. Bunu yapmanın anahtarı cwd, klasör yapısını belirtilen çalışma dizinine göre koruyacak seçenektir:

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
  }
}

Teşekkürler - haklısın, bu cevap daha çok soruyu sorduğumda aradığım şeydi. Önceki cevabın neden olduğu düzleşmeyle başa çıkmayı öğrendim ama can sıkıcıydı.
Evan Hobbs

14
Bunun için bir saatten fazla kaybettim ... cwdSeçenekleri kullanırsanız , döndüğünüzden emin olun expand:true. Ayarlamazsanız expand:true, cwd düzgün çalışmayacaktır.
ducin

2
Bunu çalıştırmak için dizin yollarının '/' ile bittiğinden emin olmalı ve eklemeliydim flatten: false.
Samuel Rossille

**/* İşte aradığım buydu ** teşekkürler dostum.
Sam

43

Bir dosya glob'u belirtirseniz, bu görev klasör yapısını koruyacaktır. flattenYapıyı kaldıracak seçenek , istediğiniz şeydir.

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

Github deposundaki mevcut seçeneklerin geri kalanını bulun . Bu yardımcı olur umarım.


25

Ben biçimini değiştirmeden eklemek istiyorum topak halinde src kopya nasıl çalıştığını değiştirecektir.

Yukarıda bmoeskau tarafından belirtildiği gibi, aşağıdakiler içindeki her şeyi kopyalayacak dist/ve onu taşıyacak path/to/dir(zaten varsa hedefin üzerine yazacak ).

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

Ancak şunu unutmayın:

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

Yalnızca dosyaları içine kopyalar dist/yanı sıra dizinleri, ancak değil hedefe bu dizinlerin içeriğini kopyalayın.

Ayrıca, ile şu src: '*/*'olacak , sadece içeride içeriği ile dizinleri kopyalamak dist/. Yani, sadece içindeki dosyalar dist/kopyalanmayacaktır.

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

Son olarak, yukarıdaki ile aynı fakat src: '**/**'kopyalar sadece içeride dosyalarını dist/yanı sıra iç dosyalar dist/için alt dizinleri path/to/dir. Yani hedefin içinde klasör olmayacak.

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

4
harika açıklama! +1
myrocode


+1 Yıldız sayısının ne anlama geldiğine dair bir kongre var mı, örneğin her **zaman dosyalar ve dizinler ve *sadece dosyalar anlamına mı geliyor?
CodyBugstein

1
@Imray bash kılavuzundan : *Tek bir kalıp olarak kullanılan iki bitişik s tüm dosyalarla ve sıfır veya daha fazla dizin ve alt dizinle eşleşecektir . Ardından a gelirse /, iki bitişik *s yalnızca dizinlerle ve alt dizinlerle eşleşir .
Jorge Bucaran

1
**her şeyle eşleşir , oysa **/ yalnızca dizinler ve alt dizinler (dosyalar değil).
Jorge Bucaran

2

Dosya segmenti için (Coffeescript'te) küme parantezleri yerine egdy kullanmak gerekiyordu ...

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

0

Açısal yeoman ile geliştiriyorsanız, homurdanarak kopyalama yapmanın daha iyi yolu budur. expand: true, cwd kullanılırken gereklidir. <% = yeoman.app%> yalnızca uygulama rotasıdır ('.').

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }

Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, çünkü bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
Goodbye StackExchange
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.