我不介意在必要时偶尔重复某些内容,但在MSBuild中,我真的不知道如何永远避免重复。它没有通常意义上的“函数”;一个目标只能被调用一次,即使通过CallTarget
,<Import>
也只能在Project
级别上工作。
这里有一个我正在尝试消除重复的具体例子:
<Target Name="Tgt1">
<PropertyGroup><Conf1>Twiddle</Conf1><Conf2>Thing</Conf2></PropertyGroup>
<PropertyGroup><xxxxxxxxxxExePath>$(xxxxxxxBuildRoot)\$(Conf1)Console-xxxxxxxxed</xxxxxxxxorExePath></PropertyGroup>
<MSBuild Projects="$(BuildSingleProj)" Targets="Build;Merge"
Properties="Configuration=$(Conf1)$(Conf2);Platform=$(Platform);CompiledFileName=$(CompiledFileName);ProjectName=$(ProjectName);SolutionFile=$(SolutionFile);Root=$(Root);Caller=$(MSBuildProjectFullPath)"/>
<MakeDir Directories="$(xxxxxxxxorExePath)" />
<WriteLinesToFile File="$(xxxxxxxxorExePath)\xxxxxxx.IsPortable.txt" />
<WriteLinesToFile File="$(xxxxxxxxorExePath)\xxxxxxx.Global.Settings.xml" Lines="@(xxxxxxxLicense)" Overwrite="true" />
<Exec Command='$(xxxxxxxxorExePath)\xxxxxxx.exe -a "$(xxxxxxxBuildRoot)\$(Conf1)$(Conf2)-Merged\xxxxxxx.exe" "$(xxxxxxxBuildRoot)\$(Conf1)$(Conf2)-xxxxxxxxed\xxxxxxx.exe"'/>
</Target>
我有四个这样的目标:
Tgt1
、Tgt2
、Tgt3
和Tgt4
。这四个目标之间唯一不同的是第一行,定义了Conf1
和Conf2
。我所知道的唯一比较可行的去重想法是将共享代码移到一个新目标中,并通过
MSBuild
任务调用它。不幸的是,这需要手动传递一长串属性,并且该任务使用相当多的属性(我数了11个属性和1个项目组)。另一个要求是,我可以使用任意子集的这些目标来调用脚本,例如
\t:Tgt2,Tgt3
。是否有任何明智的替代方法来避免只是复制/粘贴这块代码-而不涉及大量属性列表的复制?
/t:Tgt1,Tgt2
的能力——实际脚本有几个更多的目标,我们依赖于像这样选择任意子集的能力。 - Roman Starkov