使用 Grunt.js 将所有文件从目录复制到另一个目录
Posted
技术标签:
【中文标题】使用 Grunt.js 将所有文件从目录复制到另一个目录【英文标题】:Copy all files from directory to another with Grunt.js copy 【发布时间】:2013-09-28 18:38:01 【问题描述】:作为构建过程的一部分,我正在尝试将目录中的所有文件复制到另一个目录。它适用于我明确指定的单个文件,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或根本不复制)。这是我的 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】:如果您正在使用 angular yeoman 进行开发,那么这是使用 grunt 进行复制的更好方法。 expand: 使用 cwd 时需要 true。 只是应用程序路由 ('.')。
expand: true,
cwd: '<%= yeoman.app %>/data',
dest: '<%= yeoman.dist %>/data',
src: ['**']
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!【参考方案2】:文件段必须使用 egdy 而不是花括号(在 Coffeescript 中)...
copy:
files: [
cwd: 'path/to/files'
src: '**/*'
dest: 'dist/files'
expand: true
]
【讨论】:
【参考方案3】:我想补充一点,在 src 中更改 glob 的格式将修改副本的工作方式。
正如上面 bmoeskau 所指出的,以下内容将复制dist/
内的everything 并将其移动到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 比github上的文档好,我喜欢例子 +1 星数的含义是否有约定,例如**
总是表示文件和目录,*
只是文件?
@Imray 来自bash manual:两个相邻的*
s 用作单个模式将匹配所有文件以及零个或多个目录和子目录乙>。如果后跟/
,则两个相邻的*
s 将仅匹配目录和子目录。
**
匹配一切,而**/
仅 目录和子目录(不是文件)。【参考方案4】:
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
【讨论】:
谢谢——你说得对,这个答案更像是我问这个问题时所寻找的。我已经学会了处理上一个答案引起的扁平化,但这很烦人。 我为此损失了一个多小时...如果您使用cwd
选项,请务必转expand:true
。如果不设置expand:true
,cwd将无法正常工作。
我必须确保目录路径以“/”结尾并添加 flatten: false
才能正常工作。
**/*
这就是我一直在寻找的东西,我正在使用**谢谢伙计。【参考方案5】:
如果您指定文件 glob,此任务将维护文件夹结构。你想要的是 flatten
选项,它将删除结构。
expand: true,
flatten: true,
src: ['src/html/css/fonts/**'],
dest: 'dist/myvoice/css/fonts/',
filter: 'isFile'
在Github repo 中查找其余可用选项。希望这会有所帮助。
【讨论】:
以上是关于使用 Grunt.js 将所有文件从目录复制到另一个目录的主要内容,如果未能解决你的问题,请参考以下文章
将一个Linux系统中的文件或文件夹复制到另一台Linux服务器上(scp的使用)