我写了一个msbuild道具文件,看起来像这样:
<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>
我希望能够将该属性组放在目标范围之外以减少冗余,但是如果我这样做,似乎没有任何属性可以正常扩展。为什么这些属性不能在项目范围而不是目标范围内扩展?
<!-- 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>
答案 0 :(得分:2)
我不确定你要做什么..
但看起来您需要了解Property
,Item
和Item Metadata
Property
由$
引用并包含单个值
{li> Item
由@
引用,可以是数组,可以包含多个值
Item metadata
由%
引用,可以被视为每种Item
带来的某种词典 所以,如果你试图在Project范围内声明PropertyGroup,你可能不会在其中包含数组 - 但看起来就像你想要做的那样。
您可以尝试将项目元数据与现有项目关联,并在任何目标中使用此元数据。
这是msbuild 4的工作示例(以前的版本有自己的魔力):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<!-- Dummy initializations -->
<ItemGroup>
<XDTConfig Include="item1.ext1" />
<XDTConfig Include="item1.ext2" />
<XDTConfig Include="item2.ext2" />
<XDTConfig Include="item2.ext3" />
<XDTConfig Include="item3.ext3" />
</ItemGroup>
<PropertyGroup>
<Configuration>Debug</Configuration>
</PropertyGroup>
<Target Name="InitMetadata">
<!-- Assigning custom metadata to already existing items -->
<ItemGroup>
<XDTConfig Condition="'%(XDTConfig.Identity)' == '%(Identity)'">
<XDTSource>%(Filename).template%(Extension)</XDTSource>
<XDTDest>%(Filename)%(Extension)</XDTDest>
<XDTTrans>%(Filename).$(Configuration)%(Extension)</XDTTrans>
<XDTDir>%(RootDir)%(Directory)</XDTDir>
</XDTConfig>
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="InitMetadata">
<!-- Here we use item metadata for batching Message target -->
<Message Importance="High" Text="Transform: Source = %(XDTConfig.XDTDir)%(XDTConfig.XDTSource), Destination = @(XDTConfig), Transform = %(XDTConfig.XDTDir)%(XDTConfig.XDTTrans)" />
</Target>
</Project>
这里是Message任务输出(D:\temp\msbuild\
正在运行dir):
Transform: Source = D:\temp\msbuild\item1.template.ext1, Destination = item1.ext1, Transform = D:\temp\msbuild\item1.Debug.ext1
Transform: Source = D:\temp\msbuild\item1.template.ext2, Destination = item1.ext2, Transform = D:\temp\msbuild\item1.Debug.ext2
Transform: Source = D:\temp\msbuild\item2.template.ext2, Destination = item2.ext2, Transform = D:\temp\msbuild\item2.Debug.ext2
Transform: Source = D:\temp\msbuild\item2.template.ext3, Destination = item2.ext3, Transform = D:\temp\msbuild\item2.Debug.ext3
Transform: Source = D:\temp\msbuild\item3.template.ext3, Destination = item3.ext3, Transform = D:\temp\msbuild\item3.Debug.ext3