Скопируйте все файлы из каталога в другой с помощью копии Grunt.js

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

Ответ 1

Параметр flatten: true, как в этом ответе, может работать в некоторых случаях, но мне кажется, что более распространенное требование (как в моем случае) заключается в том, чтобы скопируйте папку и ее структуру подпапок, as-is, в 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
  }
}

Ответ 2

Эта задача будет поддерживать структуру папок, если вы укажете файл glob. Вы хотите использовать параметр flatten, который удалит структуру.

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

Найдите остальные доступные параметры в Github repo. Надеюсь, это поможет.

Ответ 3

Я хотел бы добавить, что изменение формата glob в 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

Придется использовать egdy вместо фигурных скобок для сегмента файлов (в Coffeescript)...

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

Ответ 5

Если вы развиваетесь с помощью angular yoman, тогда это лучший способ скопировать с хрюканьем. expand: true при использовании cwd. <% = yeoman.app% > - это только маршрут приложения ('.').

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