Скопируйте все файлы из каталога в другой с помощью 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/" }

5 ответов


на а в ответ может работать для некоторых случаях, но мне кажется, что более общим требованием (как в моем случае) для копирования папки и ее вложенных папок структуры, как есть, до 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
  }
}

эта задача будет поддерживать структуру папок, если вы укажете файл glob. То, что вы хотите-это flatten опция, которая удалит структуру.

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

найдите остальные доступные параметры в GitHub РЕПО. Надеюсь, это поможет.


я хотел бы добавить, что изменение формата Глоб на 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/ а также каталоги, но Уилл!--23-->не скопируйте содержимое этих каталогов в пункт назначения.

кроме того, с 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'
  }
}

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

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

Если вы разрабатываете с angular yeoman, то это лучший способ скопировать с grunt. развернуть: true требуется при использовании cwd. - это просто маршрут приложения ('.').

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