Скопіюйте всі файли з каталогу в інший за допомогою копіювання Grunt.js


91

Я намагаюся скопіювати всі файли з каталогу в інший каталог як частину мого процесу збірки. Це чудово працює для окремих файлів, які я вказую явно, але коли я намагаюся скопіювати весь каталог, це робить такі дивні речі, як копіювання повної структури каталогів (або взагалі нічого). Ось відповідна частина з мого 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/" }
    ]
  }
},

Зокрема, це останній рядок, до якого я не можу дістатись:

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

Відповіді:


149

flatten: trueВаріант , так як в цій відповіді може працювати в деяких випадках, але мені здається , що більш загальна вимога (як в моєму випадку) , щоб скопіювати папку і її структуру вкладених папок, як є, до dest. Здається, що в більшості випадків, якщо у вас є вкладені папки, на них, мабуть, посилаються таким чином у коді. Ключем до цього є cwdопція, яка збереже структуру папок щодо вказаного робочого каталогу:

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

Дякую - Ви маєте рацію. Ця відповідь - це більше те, що я шукав, коли задавав питання. Я навчився боротися із сплющенням, спричиненим попередньою відповіддю, але це дратувало.
Еван Хоббс,

13
Я втратив за це більше години ... Якщо ви використовуєте cwdопції, обов’язково зверніться expand:true. Якщо ви не встановите expand:true, cwd не працюватиме належним чином.
ducin

2
Мені довелося переконатися, що шляхи до каталогу закінчуються на '/' та додають, flatten: falseщоб це працювало.
Семюель Россіль

**/* Ось те, що я шукав, я використовував ** дякую.
Сем

43

Це завдання буде підтримувати структуру папок, якщо ви вкажете файл glob. Вам потрібен flattenваріант, який видалить структуру.

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

Знайдіть решту доступних опцій у репозиторії Github . Сподіваюся, це допомагає.


24

Я хотів би додати, що зміна формату глобуса в src змінить спосіб роботи копії.

Як зазначив bmoeskau вище, наступне копіює все всередині dist/і переміщує його path/to/dir(перезаписуючи пункт призначення, якщо він уже існує).

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

Однак зверніть увагу, що:

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

Копіюватиме лише файли всередині dist/, а також каталоги, але не буде копіювати вміст цих каталогів до місця призначення.

Крім того , такі з src: '*/*'буде тільки копіювати каталоги з вмістом всередині dist/. Тобто файли, що знаходяться всередині dist/, не будуть скопійовані.

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

Нарешті, те саме, що і вище, але src: '**/**'буде копіювати лише файли всередині dist/, а також файли всередині dist/підкаталогів path/to/dir. Отже, всередині пункту призначення не буде папок.

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

4
чудове пояснення! +1
мірокод

3
краще, ніж документація на github, мені подобаються приклади
wukong

+1 Чи існує домовленість про те, що повинна означати кількість зірочок, наприклад, чи **завжди це означає файли та каталоги, а *просто файли?
CodyBugstein

1
@Imray З посібника з Bash : два сусідні *s, що використовуються як єдиний шаблон, відповідатимуть усім файлам і нулю або більше каталогів та підкаталогів . Якщо слідувати a /, два сусідні *s будуть відповідати лише каталогам і підкаталогам .
Хорхе Букаран

1
**відповідає усьому , тоді як **/ лише каталоги та підкаталоги (не файли).
Хорхе Букаран

1

Довелося використовувати egdy замість фігурних дужок для сегменту файлів (у Coffeescript) ...

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

0

Якщо ви розробляєте кутовий йомен, то це кращий спосіб копіювати з бурчанням. expand: true при використанні cwd. <% = yeoman.app%> - це лише маршрут програми ('.').

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

Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду. Будь ласка, також намагайтеся не переповнювати свій код пояснювальними коментарями, оскільки це зменшує читабельність як коду, так і пояснень!
До побачення StackExchange
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.