MSBuild递归副本,包含%(ConfigurationToBuild.PlatformToBuild)

MSBuild递归副本,包含%(ConfigurationToBuild.PlatformToBuild),msbuild,recursion,copy,Msbuild,Recursion,Copy,我有以下任务,这是因为DestinationFile和DestinationFolder的组合不起作用,但它抓住了我想要做什么的概念: <CreateItem Include="$(Destination)\**\*.Generated.*.*"> <Output TaskParameter="Include" ItemName="GeneratedFiles" /> </CreateItem> <Copy Condition=" '%(Confi

我有以下任务,这是因为DestinationFile和DestinationFolder的组合不起作用,但它抓住了我想要做什么的概念:

<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个配置:调试所有版本、发布客户端版本和发布Web服务。原因是保持相同的构建编号和完全相同的代码库,同时让客户机和WebService项目“发布”,然后由安装项目接收

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


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

我找到了解决此问题的方法:即手动复制命令。 因此,它不太通用,在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***.Generated.*.sql”解析为与上述路径相同的路径将提供%(RecursiveDir)元数据。(注意子文件夹和源之间细微的“.”

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