MSbuild减少冗余元数据字符串

时间:2013-03-22 19:52:01

标签: msbuild

我写了一个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>

我希望能够将该属性组放在目标范围之外以减少冗余,但是如果我这样做,似乎没有任何属性可以正常扩展。为什么这些属性不能在项目范围而不是目标范围内扩展?


基于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>

1 个答案:

答案 0 :(得分:2)

我不确定你要做什么..

但看起来您需要了解PropertyItemItem Metadata

之间的差异
    {li> 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