MSBuild-捕获原始属性值


<PropertyGroup>
<RootNamespace>MyCustomNamespace</RootNamespace>
</PropertyGroup>
<!-- warn if not default -->
<ItemGroup Condition="$(TargetServer) and '$(RootNamespace)' != '$(MSBuildProjectName)'">
<MyWarnings Include="RootNamespace would be overridden">
<Info>$(RootNamespace)</Info>
<Code>MY0001</Code>
</MyWarnings>
</ItemGroup>
<PropertyGroup Condition="$(TargetServer)">
<RootNamespace>MyServer.$(AssemblyName)</RootNamespace>
</PropertyGroup>
<Target Name="ShowMyWarnings" AfterTargets="AfterBuild" Condition="'@(MyWarnings)' != ''">
<Warning Text="@(MyWarnings) %(MyWarnings.Info)" Code="%(MyWarnings.Code)"/>
</Target>

输出新值

警告MY0001:RootNamespace将被MyServer.MyAssemblyName 覆盖

但我想要项目定义时的属性值

警告MY0001:RootNamespace将被MyCustomNamespace 覆盖

阅读此文档,它看起来是不可能的(在项目之前评估属性(,也许有一些变通方法?

由于属性在项之前评估,因此应在属性评估阶段(在另一个属性中(捕获值。

<Choose>
<When Condition="'$(RootNamespace)' != '$(MSBuildProjectName)'">
<PropertyGroup>
<OldRootNamespaceValue>$(RootNamespace)</OldRootNamespaceValue>
</PropertyGroup>
<ItemGroup>
<MyWarnings Include="RootNamespace would be overridden">
<Info>$(OldRootNamespaceValue)</Info>
<Code>MY0001</Code>
</MyWarnings>
</ItemGroup>
</When>
</Choose>

最新更新