MSBuild:Items + Batching + CreateItem +转换问题

时间:2009-04-28 19:00:28

标签: msbuild transform batching

我有一个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 个答案:

答案 0 :(得分:3)

当目标被批处理时,它独立于同一批处理目标的其他执行而执行。因此,在第一次执行时,您将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

那清除了吗?批处理有时会让人感到困惑。

以下是批处理的一些链接:

答案 1 :(得分:0)

不是

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

加上

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

导致2 x 2而不是1x4