具有多个输出的MsBuild目标

具有多个输出的MsBuild目标,msbuild,msbuild-target,msbuild-batching,Msbuild,Msbuild Target,Msbuild Batching,当您有多个输出时,是否有办法克服目标一对一映射?看起来这应该是可能的,但我不知道怎么做,因为我对MsBuild还很陌生,我可能遗漏了一些东西 以下msbuild脚本来自microsoft的文档。当我有多个备份文件夹时,我应该更改什么?那么一个列表@(备份文件夹)和我想保持构建的增量行为 <Target Name="Backup" Inputs="@(Compile)" Outputs="@(Compile->'$(BackupFolder)%(Identity).bak

当您有多个输出时,是否有办法克服目标一对一映射?看起来这应该是可能的,但我不知道怎么做,因为我对MsBuild还很陌生,我可能遗漏了一些东西

以下msbuild脚本来自microsoft的文档。当我有多个备份文件夹时,我应该更改什么?那么一个列表@(备份文件夹)和我想保持构建的增量行为

<Target Name="Backup" Inputs="@(Compile)"   
    Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">  
    <Copy SourceFiles="@(Compile)" DestinationFiles=  
        "@(Compile->'$(BackupFolder)%(Identity).bak')" />  
</Target>  

首先,目标节点上的输入和输出属性用于。它们需要具有相同数量的条目,以便msbuild了解在生成时应过滤哪些项。MSBuild检查输出是否已经存在并且是最新的,如果是,则从输入列表中筛选匹配的输入项。如果您不喜欢增量构建,可以完全跳过此机制。如果输入和输出不匹配(或不存在),msbuild将始终使用所有项执行目标,因为它无法决定哪些项导致哪些输出

其次,这些属性所期望的是一个项目列表。这不必是一个列表,它可以是任意列表。因此,这样扩展您的示例是完全公平的:

<Target Name="Backup" Inputs="@(Compile);@(Compile2)"   
  Outputs="@(Compile->'$(BackupFolder)%(Identity).bak');@(Compile2->'$(BackupFolder)%(Identity).bak')">  
  <Copy SourceFiles="@(Compile)" DestinationFiles=  
     "@(Compile->'$(BackupFolder)%(Identity).bak')" />  
  <Copy SourceFiles="@(Compile2)" DestinationFiles=  
     "@(Compile2->'$(BackupFolder)%(Identity).bak')" />  
</Target>

但是您想将相同的项目复制到不同的备份文件夹,对吗?这样做应该可以:

<Target Name="Backup">  
  <Copy SourceFiles="@(Compile)" DestinationFiles=  
      "@(Compile->'$(BackupFolder)%(Identity).bak')" />  
  <Copy SourceFiles="@(Compile)" DestinationFiles=  
      "@(Compile->'$(BackupFolder2)%(Identity).bak')" />  
</Target>

使用两个备份文件夹时,一个文件夹中的项目实际上可能已经是最新的,但另一个文件夹中缺少该项目。您可以将其中一个定义为“主”备份文件夹,并告诉MSBuild将其用作增量生成的引用

编辑:对于两个位置的增量构建,最简单的解决方案可能是合并两个目标,都是增量构建:

<Target Name="Backup" DependsOnTargets="_Backup1;_Backup2">
</Target>

<Target Name="_Backup1" Inputs="@(Compile)"   
  Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">  
  <Copy SourceFiles="@(Compile)" DestinationFiles=  
     "@(Compile->'$(BackupFolder)%(Identity).bak')" />    
</Target>

<Target Name="_Backup2" Inputs="@(Compile)"   
  Outputs="@(Compile->'$(BackupFolder2)%(Identity).bak')">  
  <Copy SourceFiles="@(Compile)" DestinationFiles=  
     "@(Compile->'$(BackupFolder2)%(Identity).bak')" />  
</Target>


我想保留增量构建功能。我不确定你的两种方法是否都能做到这一点。我没有描述的问题是,应该将项目复制到两个目的地。如果已经在一份中,跳过那份,只做另一份。对不起,我想的太复杂了。最简单的方法可能是实现两个单独的目标,备份到不同的位置,并确保两者都被调用。