使用MSBuild递归复制所有文件

时间:2011-12-20 00:03:23

标签: .net msbuild xbuild

我有以下一组带有MSBuild的文件:

<ScriptFiles Include="Server/scripts/**/*.js" />

然后我将所有内容复制到另一个目录:

<Copy SourceFiles="@(ScriptFiles)" DestinationFiles="@(ScriptFiles->'$(BuildDir)/WWW/scripts/%(RecursiveDir)%(Filename)%(Extension)')" />

但是,我要做的是复制*.js,然后复制/yui/*.*。我尝试做的是:

<ScriptFiles Include="Server/scripts/**/*.js;Server/scripts/yui/**/*" />

但是,这样做会使/yui/目录变平并将所有yui的文件直接放入/WWW/scripts

有更好的方法吗?

顺便说一句,我实际上使用的是XBuild而不是MSBuild,但从我所看到的情况来看,这两者大部分都是兼容的。

2 个答案:

答案 0 :(得分:3)

%(RecursiveDir)将匹配通配符部分。所以,如果在/ yui /你有:

衣/富/酒吧/ abc.dll

然后,yui/**/*会将%(RecursiveDir)作为“foo / bar”。这是你期待的吗?如果是,那么这应该适用于xbuild。你使用的是哪个版本? (xbuild --help)。

当您想要从子目录收集文件时,也使用

“**”。如果你要做的事情有所不同,那么请你举一个文件很少的例子吗?

尝试这样的事情:

<Message Text="ScriptFile: %(ScriptFile.Identity) , RD: %(ScriptFile.RecursiveDir)"/>
<Message Text="Paths: @(ScriptFiles->'$(BuildDir)/WWW/scripts/%(RecursiveDir)%(Filename)%(Extension)')"/>

这应该可以深入了解它无法正常工作的原因。

答案 1 :(得分:1)

更新了Ritch的评论(我添加了Exclude以避免两次复制相同的文件):

不应该是两个单独的行:

<ScriptFiles Include="Server/scripts/**/*.js" Exclude="Server/scripts/yui/**/*"/> 
<YuiFiles Include="Server/scripts/yui/**/*" />

OR

<YuiFiles Include="Server/scripts/yui/**/*" />
<ScriptFiles Include="Server/scripts/**/*.js" Exclude="@(YuiFiles)"/> 

<Copy SourceFiles="@(YuiFiles)" DestinationFiles="..." />    
<Copy SourceFiles="@(ScriptFiles)" DestinationFiles="..." />