MSBuild: Items + Batching + CreateItem + Transforms Вопрос - PullRequest
2 голосов
/ 28 апреля 2009

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

Ответы [ 2 ]

3 голосов
/ 10 сентября 2009

Когда цель группируется, она подвергается воздействию независимо от других исполнений той же пакетной цели. Итак, при первом выполнении вы заполнили элемент 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

Это проясняет? Временами пакетирование может быть немного запутанным.

Вот несколько ссылок на дозирование:

0 голосов
/ 29 апреля 2009

разве это не

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

В сочетании с

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

, что вызывает 2 x 2, а не 1x4

...