Javascript 使用Grunt.js Copy将所有文件从目录复制到另一个目录

Javascript 使用Grunt.js Copy将所有文件从目录复制到另一个目录,javascript,gruntjs,Javascript,Gruntjs,作为构建过程的一部分,我正在尝试将一个目录中的所有文件复制到另一个目录。对于我明确指定的单个文件,它工作得很好,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或者什么都不复制)。以下是我的Grunfile.js中的相关部分: copy: { myvoice: { files: [ { src:"src/html/index.html", dest:"dist/myvoice/index.html" }, { src:"src/htm

作为构建过程的一部分,我正在尝试将一个目录中的所有文件复制到另一个目录。对于我明确指定的单个文件,它工作得很好,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或者什么都不复制)。以下是我的Grunfile.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/" }

如果您指定文件glob,此任务将保持文件夹结构。您需要的是
展平
选项,该选项将删除该结构

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

在中查找其余可用选项。希望这有帮助。

中的
展平: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
  }
}

我想补充一点,更改src中的格式将修改副本的工作方式

正如上面bmoeskau所指出的,以下程序将复制
dist/
中的所有内容,并将其移动到
path/to/dir
(如果目标已存在,则覆盖该目标)

然而,请注意:

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  }
}
将仅复制
dist/
内的文件以及目录,但不会将这些目录的内容复制到目标

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}
此外,以下带有
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中)


如果您使用angular yeoman进行开发,那么这是使用grunt进行复制的更好方法。 expand:true在使用cwd时是必需的。只是应用程序路径('.')

{
是的,
cwd:“/data”,
dest:“/data”,
src:['**']
}

谢谢——你说得对。这个答案正是我问这个问题时想要的答案。我已经学会了处理前面的答案导致的扁平化,但这很烦人。我为此损失了一个多小时。。。如果使用
cwd
选项,请确保打开
expand:true
。如果您不设置
扩展:true
,cwd将无法正常工作。我必须确保目录路径以“/”结尾,然后添加
展平:false
,以使其正常工作。
***
这就是我正在寻找的内容,我正在使用**谢谢你。非常好的解释+1与github上的文档相比,我喜欢示例+1是否有关于星星数的约定,例如
**
是否总是指文件和目录,和
*
仅文件?@Imray来自:作为单个模式使用的两个相邻的
*
将匹配所有文件以及零个或多个目录和子目录。如果后面跟一个
/
,两个相邻的
*
将只匹配目录和子目录。
***
匹配所有内容,而
***//code>只匹配目录和子目录(而不是文件)。虽然此代码片段可以解决问题,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
copy: {
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]
}
 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }