使用Grunt Copy Task时文件树变平

不知道如果我错过了一些东西,但我有以下grunt-contrib-copy任务的设置。

copy: { build: { files: { "server-dist/": "server/**/*.!(coffee)", "client-dist/": "client/**/*.!(coffee)" } } } 

client-dist的副本如我所期望的recursion运行通过文件树,但服务器的所有子文件夹平铺到基本文件夹。 任何想法为什么发生这种情况? 这是I / O

 server/ views/ errors/ 404.jade layouts/ base.jade 

 server/ errors/ layouts/ base.jade 

视图文件夹被完全吹掉。 还有一件事…当我删除!(咖啡)它的作品,但我需要排除咖啡文件,因为我有一个grunt咖啡的手表任务运行。

显然grunt-contrib-copy任务有一个复杂的逻辑,试图自动检测复制源文件的基本目录(参见相关的问题 )

解决scheme是明确指定basePath选项:

 copy: { build: { files: { "server-dist/": "server/**/*!(.coffee)" }, options: { basePath: 'server' // base directory in the source path } } } 

PS我不确定,但是,为什么删除!(.coffee)改变你的行为。 我在本地机器上尝试了相同的结果,当指定"server/**/*"而不是"server/**/*.!(coffee)" (即跳过views文件夹)

跟进zacks评论:

 copy: { mytask: { files: [ {expand:true, cwd:'dev-js/abc/', dest:'js/test/', src:['def.js']} ] } } 

这将文件./dev-js/abc/def.js复制到./js/test/def.js – 至less在我的0.4.1版本。 Zacks的评论和包括的链接是非常有益的,特别是基本basePath已被取代的事实。