我编写了一个如下所示的 msbuild props 文件:
<Target Name="BeforeBuild"
Inputs="@(XDTConfig -> '%(Filename).template%(Extension)');
@(XDTConfig -> '%(Filename).$(Configuration)%(Extension)')"
Outputs="@(XDTConfig)">
<PropertyGroup>
<XDTSource>@(XDTConfig -> '%(Filename).template%(Extension)')</XDTSource>
<XDTDest>@(XDTConfig -> '%(Filename)%(Extension)')</XDTDest>
<XDTTrans>@(XDTConfig -> '%(Filename).$(Configuration)%(Extension)')</XDTTrans>
<XDTDir>@(XDTConfig -> '%(RootDir)%(Directory)')</XDTDir>
</PropertyGroup>
<Message Importance="High"
Text="Transforming from $(XDTSource) using $(XDTTrans) to $(XDTDest)..." />
<TransformXml Source="$(XDTDir)$(XDTSource)"
Destination="@(XDTConfig)"
Transform="$(XDTDir)$(XDTTrans)" />
</Target>
我希望能够将该属性组放在目标范围之外以减少冗余,但如果我这样做,似乎没有一个属性可以正确扩展。为什么这些属性不能在项目范围而不是目标范围内扩展?
基于Lanorkin的解决方案
<!-- File name and path properties -->
<Target Name="InitMetadata">
<ItemGroup>
<XDTConfig Condition="'%(XDTConfig.Identity)' == '%(Identity)'">
<Source>%(Filename).template%(Extension)</Source>
<Dest>%(Filename)%(Extension)</Dest>
<Trans>%(Filename).$(Configuration)%(Extension)</Trans>
<Dir>%(RootDir)%(Directory)</Dir>
</XDTConfig>
</ItemGroup>
</Target>
<!-- Target to transform the config file if necessary -->
<Target Name="BeforeBuild"
DependsOnTargets="InitMetadata"
Outputs="@(XDTConfig)"
Inputs="'%(Source)';'%(Trans)'">
<!-- Show what's going on -->
<Message Importance="High"
Text="Transforming from @(XDTConfig -> '%(Source) using %(Trans) to %(Dest)')..." />
<!-- Do the actual transform (silent) -->
<TransformXml Destination="@(XDTConfig)"
Source="%(Dir)%(Source)"
Transform="%(Dir)%(Trans)" />
</Target>