2009-04-14 36 views
1

我有以下的任务,这是因为DestinationFiles和DestionationFolder的组合不工作,但它抓住的是我想做的概念:的MSBuild递归复制为%(ConfigurationToBuild.PlatformToBuild)

<CreateItem Include="$(Destination)\**\*.Generated.*.*"> 
    <Output TaskParameter="Include" ItemName="GeneratedFiles" /> 
</CreateItem> 

<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug-All' Or '%(ConfigurationToBuild.FlavorToBuild)'=='Release-WebService' " 
     SourceFiles="@(GeneratedFiles)" 
     DestinationFiles="@(GeneratedFiles-&gt;'%(RecursiveDir)%(Filename)%(Extension)')" 
     DestinationFolder="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" 
/> 

所以我有一组正在生成的文件(数据,而不是代码),这些文件需要复制到最终的二进制文件位置。

在此版本中,我一次构建3个配置:全部调试版本,发布客户端版本和发布WebService。原因是保持相同的内部版本号和完全相同的代码库,同时让客户端和WebService项目“发布”,然后由安装项目获取。

如果我尝试使用: DestinationFiles =“@(GeneratedFiles- >“$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)\%(RecursiveDir)%(文件名)%(分机)')“

MSBuild在%(ConfigurationToBuild.FlavorToBuild)部件上引发错误。

回答

0

我找到了解决此问题的方法:即手动复制命令。 所以它不那么通用,并且在buildlog文件中产生更多的噪声,但至少它工作正常!

<!-- Copy the updated files to the Binariesroot to have them picked up by the Setups --> 
<CreateItem Include="$(Destination)\**\*.Generated.*.sql"> 
    <Output TaskParameter="Include" ItemName="GeneratedSqlFiles" /> 
</CreateItem> 
<Message Text="[email protected](GeneratedSqlFiles)->RecursiveDir=%(RecursiveDir) Filename=%(Filename)%(Extension)" /> 

<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
       Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" > 
    <Output TaskParameter="Value" PropertyName="RealBinariesRoot" /> 
</CreateProperty> 
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
     SourceFiles="@(GeneratedSqlFiles)" 
     DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 
<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'" 
      Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" > 
    <Output TaskParameter="Value" PropertyName="RealBinariesRoot" /> 
</CreateProperty> 
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'" 
     SourceFiles="@(GeneratedSqlFiles)" 
     DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 

同时发现,如果你有'。'在CreateItem任务的包含路径中,RecursiveDir属性不再被填充。 因此有

'drive:\ somefolder \ subfolder \ Sources \ Generated ***。Generated。*。sql'将提供% (RecursiveDir)元数据。 使用

'驱动器:\ somefolder \的子文件夹\ \源头\生成*** *生成SQL。',其解析为相同的路径如上述将NOT提供%(RecursiveDir)的元数据。 (注意子文件夹和源文件之间的细微'。')

当然(墨菲法则)我们用这个来指定哪个分支需要构建。指向主分支;-)