是否可以明确指示MSBuild可以为目标进行部分增量重建?

时间:2015-04-29 11:16:16

标签: msbuild

我是Unix上GNU make 的合格用户,负责在Windows 7上使用MSBuild编写构建系统。(Cygwin不是一个选项)

partial incremental builds上的MSBuild文档指出:

  

MSBuild尝试在[输入和输出属性]的值之间找到1对1的映射。

     

[...]

     

通常通过项目转换生成1对1映射。

如果通过项目转换生成通常的1对1映射,是否有任何其他方式可以生成它们?

该页面包含以下示例目标:

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

令我困扰的是,从@(Compile)项到.bak文件集的转换是重复的。它在目标的Outputs属性中显示一次,在复制任务的DestinationFiles属性中显示一次。

我希望能够只指定一次转换,最好为备份文件声明一个Item。我可能想在其他任务和目标中使用相同的项目。例如:

<ItemGroup>
    <BackupFiles Include="@(Compile->'$(BackupFolder)%(Identity).bak')" />
</ItemGroup>

<Target Name="Backup" Inputs="@(Compile)" Outputs="@(BackupFiles)">
    <Copy SourceFiles="@(Compile)" DestinationFiles="@(BackupFiles)" />
</Target>

然后我可以使用@(BackupFiles)作为目标的OutputsDestinationFiles的{​​{1}},也可能使用其他地方。 但是,如果我这样做,那么部分增量构建将停止发生。如果所有输出都是最新的,则会正确跳过目标,但如果某些输出已过期,则目标将运行 all 投入。在目标运行时,似乎无法识别Copy@(Compile)之间的1对1映射。

我的问题是:

  1. 可以指示MSBuild在Target的输入和输出属性之间存在1对1映射时,如果它自己没有找到它,例如@(BackupFiles)和{{1上面?

  2. 是否有相当于制作@(Compile)@(BackupFiles)$^值的内容。那是;当前目标的输入和输出?特别是我想使用$<之类的东西作为复制任务的$@。那是; &#34;无论你认为什么输出;使用&#34;

  3. PS:我有&#34;使用MSBuild和Team Foundation Build&#34;书(第2版),如果有人想参考它。

0 个答案:

没有答案