2013-09-23 115 views
84

我试图将目录中的所有文件复制到另一个目录作为我的构建过程的一部分。它适用于我明确指定的单个文件,但是当我尝试复制整个目录时,它会执行奇怪的操作,例如复制完整的目录结构(或根本没有任何内容)。下面是相关的部分从我GruntFile.js:使用Grunt.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/" } 

回答

138

flatten: true选项,如this answer可能会为某些情况下工作,但在我看来,更多的共同要求(如在我的情况)是一个文件夹及其子文件夹结构复制,原样,以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 
    } 
} 
+0

谢谢 - 你是对的,这个答案更多的是当我问这个问题时我正在寻找的东西。我学会了处理前一个答案造成的扁平化,但它很烦人。 –

+12

我已经失去了一个多小时...如果你使用'cwd'选项,一定要把'expand:true'。如果你没有设置'expand:true',cwd将无法正常工作。 – ducin

+2

我必须确保目录路径以'/'结尾并添加'flatten:false'才能使其工作。 –

42

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

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

查找Github repo中其余的可用选项。希望这可以帮助。

22

我想补充一点,改变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

很好的解释! +1 – myrocode

+2

比github上的文档更好,我喜欢示例 – wukong

+0

+1是否有关于星星的数量应该表示的约定,例如'**'总是指文件和目录,而'*'只是文件? – CodyBugstein

0

不得不使用egdy代替花括号来代替文件段(在Coffeescript中)...

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

如果你正在开发角度yeoman,那么这是用grunt复制的更好方法。 expand:使用cwd时需要为true。 <%= yeoman.app%>就是app路线('。')。

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

虽然此代码片段可能会解决问题,但[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要使用解释性注释来挤占代码,因为这会降低代码和解释的可读性! – FrankerZ

相关问题