使用MSBuild递归复制所有文件

3

我有一组包含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,但据我所见,两者在大多数情况下是兼容的。


你期望/yui/目录下的文件放在哪里?是在/WWW/scripts/yui/下吗? - Russ Cam
是的!唯一的区别是我想在YUI文件中包括*.*,因为该目录包含像.css文件、图像等内容。 - Mike Christensen
这不应该是两行吗: <ScriptFiles Include="Server/scripts/**/*.js" /> <ScriptFiles Include="Server/scripts/yui/**/*" /> - Rich Tebb
是的,我可以使用两个单独的行,但那不会复制所有文件两次吗?YUI目录非常大。 - Mike Christensen
2个回答

3

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

/yui/foo/bar/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)')"/>

这应该可以让您了解为什么它不起作用。

是的,我已经知道为什么它不起作用了。我想知道如何修复它。使用两行似乎是解决问题的方法。 - Mike Christensen
好的,那么使用两行代码,并且对于“yui”任务调用,在Copy任务中设置SkipUnchangedFiles=true。 - radical
好的!我要么这样做,要么指定YUI在其源代码中包含的所有不同扩展。 - Mike Christensen
@Mike 在进行复制之前,你可以使用RemoveDuplicates Task过滤你的ScriptFiles集合。 - Filburt
@Mike Oups - 看起来 RemoveDuplicates 也会删除所有的 RecursiveDir 信息 :-( - Filburt
@Filburt - 这不好!我回家后会再仔细研究一下,看看能否找到一个高效的解决方案。 - Mike Christensen

1

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

这不应该是两行吗:

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

或者

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接