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