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

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

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.


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

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

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: ['**']
    }

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.