Skopiuj wszystkie pliki z katalogu do innego za pomocą kopii Grunt.js.

91

Próbuję skopiować wszystkie pliki z katalogu do innego katalogu w ramach procesu kompilacji. Działa dobrze w przypadku pojedynczych plików, które wyraźnie określam, ale kiedy próbuję skopiować cały katalog, robi dziwne rzeczy, takie jak kopiowanie pełnej struktury katalogów (lub w ogóle nic). Oto odpowiednia część z mojego pliku GruntFile.js:

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

W szczególności jest to ostatnia linia, której nie mogę zabrać do pracy:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
Evan Hobbs
źródło

Odpowiedzi:

149

flatten: trueOpcja jak w tej odpowiedzi może pracować dla niektórych przypadkach, ale wydaje mi się, że bardziej powszechne zapotrzebowanie (jak w moim przypadku) jest skopiować folder i jego strukturę podfolderów, jak jest się dest. Wygląda na to, że w większości przypadków, jeśli masz podfoldery, prawdopodobnie są one przywoływane w ten sposób w kodzie. Kluczem do tego jest cwdopcja, która zachowa strukturę folderów w odniesieniu do określonego katalogu roboczego:

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
źródło
Dzięki - masz rację, ta odpowiedź jest bardziej tym, czego szukałem, gdy zadałem pytanie. Nauczyłem się radzić sobie ze spłaszczeniem spowodowanym poprzednią odpowiedzią, ale było to denerwujące.
Evan Hobbs
13
Straciłem na to ponad godzinę ... Jeśli używasz cwdopcji, koniecznie włącz expand:true. Jeśli tego nie ustawisz expand:true, cwd nie będzie działać poprawnie.
ducin
2
Musiałem upewnić się, że ścieżki katalogów kończą się znakiem „/” i dodać, flatten: falseaby to działało.
Samuel Rossille
**/* Właśnie tego szukałem, którego używałem ** dzięki stary.
Sam
43

To zadanie zachowa strukturę folderów, jeśli określisz plik globalny. To, czego chcesz, to flattenopcja, która usunie strukturę.

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

Znajdź pozostałe dostępne opcje w repozytorium Github . Mam nadzieję że to pomoże.

Ben
źródło
24

Dodam, że zmiana formatu globu w src zmieni sposób działania kopii.

Jak wskazano powyżej w bmoeskau , poniższe czynności skopiują wszystko w środku dist/i przeniesie je do path/to/dir(nadpisując miejsce docelowe, jeśli już istnieje).

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

Pamiętaj jednak, że:

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

Kopiuje tylko pliki wewnątrz dist/oraz katalogi, ale nie kopiuje zawartości tych katalogów do miejsca docelowego.

Ponadto, dodaje się src: '*/*'będzie tylko skopiować katalogi z zawartością wewnątrz dist/. Oznacza to, że pliki znajdujące się w środku dist/nie zostaną skopiowane.

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

Na koniec tak samo jak powyżej, ale src: '**/**'skopiuje tylko pliki wewnątrz, dist/a także pliki wewnątrz dist/podkatalogów do path/to/dir. Dlatego w miejscu docelowym nie będzie żadnych folderów.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}
Jorge Bucaran
źródło
4
świetne wyjaśnienie! +1
myrocode
3
Lepiej niż dokumentacja na githubie, lubię przykłady
wukong
+1 Czy istnieje konwencja określająca, co powinna oznaczać liczba gwiazdek, na przykład **zawsze oznacza pliki i katalogi, a *tylko pliki?
CodyBugstein
1
@Imray Z podręcznika basha : dwa sąsiednie *s użyte jako pojedynczy wzorzec będą pasować do wszystkich plików i zera lub większej liczby katalogów i podkatalogów . Jeśli występuje po nim a /, dwa sąsiednie *s będą pasować tylko do katalogów i podkatalogów .
Jorge Bucaran
1
**dopasowuje wszystko , ale **/ tylko katalogi i podkatalogi (nie pliki).
Jorge Bucaran
2

Musiałem użyć egdy zamiast nawiasów klamrowych dla segmentu plików (w Coffeescript) ...

copy: {
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]
}
Saschlong
źródło
0

Jeśli rozwijasz się z kanciastym człowiekiem, jest to lepszy sposób na kopiowanie z pomrukiem. expand: true jest wymagane przy używaniu cwd. <% = yeoman.app%> to po prostu trasa do aplikacji („.”).

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }
LearnToday
źródło
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Prosimy również starać się nie wypełniać kodu komentarzami wyjaśniającymi, ponieważ zmniejsza to czytelność zarówno kodu, jak i wyjaśnień!
Goodbye StackExchange