当您有多个输出时,有没有办法克服目标一对一映射?似乎这应该是可能的,但我不知道如何,因为我对MsBuild很新,我可能会遗漏一些东西。
下面的msbuild脚本来自microsoft的文档。当我有多个备份文件夹时,我应该更改什么?所以列表@(BackupFolders),我想保持构建的增量行为?
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
答案 0 :(得分:0)
首先,目标节点上的输入和输出属性是incremental builds。他们需要具有相同数量的条目才能让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>