使用%的MSBuild递归复制(ConfigurationToBuild.PlatformToBuild)

时间:2009-04-14 08:43:00

标签: msbuild recursion copy

我有以下任务,由于DestinationFiles和DestionationFolder的组合不起作用,但它抓住了我想要做的概念:

<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个配置:Debug-All版本,Release-Client版本和Release-WebService。原因是保持相同的构建号和完全相同的代码库,同时让客户端和WebService项目“已发布”,然后由安装项目选择。

如果我尝试使用: DestinationFiles = “@(GeneratedFiles-&GT; '$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)\%(RecursiveDir)%(文件名)%(扩展部分)')”

MSBuild在%(ConfigurationToBuild.FlavorToBuild)部分抛出错误。

1 个答案:

答案 0 :(得分: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="GeneratedSqlFiles=@(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任务的Include路径中,不再填充RecursiveDir属性。 所以有

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

'drive:\ somefolder \ subfolder \。\ Sources \ Generated ***。生成。* .sql',解析为与上面相同的路径 NOT 提供%(RecursiveDir)元数据。 (注意子文件夹和源之间的微妙'。'

Ofcourse(墨菲定律)我们用它来指定需要构建哪个分支。指向主分支; - )