0

我编写了一个如下所示的 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>
4

1 回答 1

2

我不确定您要做什么..

但看起来你需要了解Property,ItemItem Metadata

  • Property由引用$并包含单个值
  • Item被引用@并且可以被称为Array,它可以包含多个值
  • 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>

这是消息任务输出(D:\temp\msbuild\正在工作的目录):

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
于 2013-03-26T15:07:22.073 回答