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

Eva*_*bbs 88 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/" }
    ]
  }
},
Run Code Online (Sandbox Code Playgroud)

具体来说,这是我无法工作的最后一行:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
Run Code Online (Sandbox Code Playgroud)

Bri*_*kau 145

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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经失去了一个多小时...如果您使用`cwd`选项,请务必转为`expand:true`.如果你没有设置`expand:true`,cwd将无法正常工作. (13认同)
  • 我必须确保目录路径以'/'结尾并添加`flatten:false`以使其正常工作. (2认同)

Ben*_*Ben 43

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

{
    expand: true,
    flatten: true,
    src: ['src/html/css/fonts/**'],
    dest: 'dist/myvoice/css/fonts/',
    filter: 'isFile'
}
Run Code Online (Sandbox Code Playgroud)

找到Github仓库中的其他可用选项.希望这可以帮助.


Jor*_*ran 23

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

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

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '**'
  }
}
Run Code Online (Sandbox Code Playgroud)

但请注意:

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  }
}
Run Code Online (Sandbox Code Playgroud)

只会复制文件内部dist/和目录,但不会将这些目录的内容复制到目标.

此外,在下面src: '*/*'复制目录里面的内容dist/.也就是说,内部的文件dist/不会被复制.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*'
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,与上面相同,但src: '**/**'复制文件内部以及子目录中的文件.所以目的地内没有文件夹.dist/dist/path/to/dir

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释!+1 (4认同)
  • 比github上的文档更好,我喜欢这些例子 (2认同)