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

时间:2013-09-23 18:42:25

标签: javascript gruntjs

我正在尝试将目录中的所有文件复制到另一个目录中,作为构建过程的一部分。它适用于我明确指定的单个文件,但是当我尝试复制整个目录时,它会执行奇怪的操作,例如复制完整的目录结构(或者根本没有)。以下是我的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 个答案:

答案 0 :(得分:142)

this answer中的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
  }
}

答案 1 :(得分:43)

如果指定文件glob,此任务将维护文件夹结构。你想要的是flatten选项,它将删除结构。

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

查找Github repo中的其他可用选项。希望这会有所帮助。

答案 2 :(得分:23)

我想补充一点,更改 src glob的格式会修改副本的工作方式。

正如上面 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' } } 。所以目的地内没有文件夹。

{{1}}

答案 3 :(得分:0)

不得不为文件段使用egdy而不是花括号(在Coffeescript中)......

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

答案 4 :(得分:0)

如果您正在使用有角度的自耕农进行开发,那么这是使用grunt进行复制的更好方法。 expand:使用cwd时需要true。 <%= yeoman.app%>只是应用路线('。')。

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