MSBuild: элементы + пакетная обработка + CreateItem + вопрос преобразования

У меня есть проект 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>

Итак, у меня есть два основных пути, которые уникальны, и в каждом из них у меня есть два каталога с одинаковыми именами в каждом из уникальных путей. В target1 я выполняю пакетную обработку идентификаторов элементов в PathDir, а затем выполняю преобразование элемента 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 отображает только каталоги, содержащие каталог, с которым он объединяется? Я знаю, что это, вероятно, связано с пакетной обработкой, но это все, что я знаю.


person Community    schedule 28.04.2009    source источник


Ответы (2)


Когда цель пакетируется, она выполняется независимо от других исполнений той же пакетной цели. Итак, при первом выполнении вы заполнили элемент FullPath содержимым

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

Затем при втором выполнении цели вы заполнили значение FullPath, которое будет

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

Поскольку элементы не видны для одной и той же групповой цели, второй проход не «видит» этот элемент FullPath. Но когда TestTarget1 завершен, значения для FullPath объединяются в одно значение, которое есть.

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

Это проясняет ситуацию? Пакетирование может иногда сбивать с толку.

Вот несколько ссылок по пакетной обработке:

person Sayed Ibrahim Hashimi    schedule 10.09.2009

разве это не

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

В сочетании с

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

это вызывает 2x2, а не 1x4

person Preet Sangha    schedule 29.04.2009