2

私はmsbuildプロジェクトのこのビットを持っているので、なぜそれが結果であるのか疑問に思います。それが問題などを引き起こしているわけではありませんが、理解を深めてみたいと思います。

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="TestTarget1;TestTarget2" ToolsVersion="3.5">

  <ItemGroup>
    <PathDir Include="C:\RootDir\UniqueDir1"/>
    <PathDir Include="C:\RootDir\UniqueDir2" />
  </ItemGroup>

  <Target Name="TestTarget1" Outputs="%(PathDir.Identity)">
    <PropertyGroup>
      <RootPath>%(PathDir.Identity)</RootPath>
    </PropertyGroup>

    <ItemGroup>
      <SubDirectory Include="Common1"/>
      <SubDirectory Include="Common2"/>
    </ItemGroup>

    <CreateItem Include="@(SubDirectory->'$(RootPath)\%(Identity)')">
      <Output TaskParameter="Include" ItemName="FullPath"/>
    </CreateItem>

    <Message Text="@(FullPath)"/>
  </Target>

  <Target Name="TestTarget2">
    <Message Text="@(FullPath)"/>
  </Target>

</Project>

したがって、一意の2つのメインパスがあり、それぞれの中に、それぞれの一意のパスに同じ名前の2つのディレクトリがあります。target1では、PathDir内のアイテムのIDに対してバッチ処理を行ってから、一意のディレクトリにある共通のフォルダー名を含むアイテムSubDirectoryで変換を実行して、フルパスを含む新しいアイテムを作成しています。とにかく、その後、ターゲットの出力は次のようになります。

ターゲット1:

  C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2
  C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2

ターゲット2:

  C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2;C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2

だから私の質問は...なぜtarget1はそれがバッチ処理しているディレクトリを含むディレクトリだけを表示するのですか?おそらくバッチ処理に関係していることはわかっていますが、私が知っているのはそれだけです。

4

2 に答える 2

3

ターゲットがバッチ化されると、同じバッチ化されたターゲットの他の実行とは独立して実行されます。したがって、最初の実行では、コンテンツに FullPath アイテムを設定しました

C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2

次に、ターゲットの 2 回目の実行で、FullPath の値を次のように設定しました。

C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2

アイテムは同じバッチ ターゲットに表示されないため、2 番目のパスはその FullPath アイテムを「認識」しません。しかし、TestTarget1 が完了すると、FullPath の値が 1 つの値に結合されます。

C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2;C:\RootDir\UniqueDir2\Common1;C:\RootDir\UniqueDir2\Common2

それはそれをクリアしますか?バッチ処理は、時々混乱することがあります。

バッチ処理に関するリンクを次に示します。

于 2009-09-10T04:28:47.777 に答える
0

それはそうではありませんか

<PropertyGroup>
  <RootPath>%(PathDir.Identity)</RootPath>
</PropertyGroup>

と相まって

<CreateItem Include="@(SubDirectory->'$(RootPath)\%(Identity)')">

これにより、1x4ではなく2x2が発生します

于 2009-04-29T08:51:36.670 に答える