0

次のようなmsbuildpropsファイルを作成しました。

<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しかし、Itemとの違いを理解する必要があるようです。Item Metadata

  • Propertyによって参照され$、単一の値が含まれています
  • Itemによって参照され、複数の値を含むことができる配列@と見なすことができます
  • Item metadataによって参照され、それぞれに付属する%ある種の辞書と考えることができますItem

したがって、ProjectスコープでPropertyGroupを宣言しようとすると、配列を含めない場合がありますが、それがやりたいことのように見えます。

アイテムメタデータを既存のアイテムに関連付けようとする場合があります。このメタデータを任意のターゲットで使用する場合に限ります。

これがmsbuild4の作業サンプルです(以前のバージョンには独自の魔法があります):

<?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 に答える