2009-04-28 21 views
1

J'ai un peu un projet msbuild qui me fait me demander pourquoi le résultat est tel qu'il est. Ce n'est pas que cela cause un problème ou quoi que ce soit de ce genre, mais j'aimerais essayer de mieux comprendre.MSBuild: Items + Batching + CreateItem + Transforms Question

<?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> 

J'ai donc deux voies principales qui sont uniques, et dans chaque j'ai deux répertoires avec les mêmes noms dans chacun des chemins uniques. Dans target1, je procède au traitement par lots de l'identité des éléments dans PathDir, puis à la transformation de l'élément SubDirectory, qui contient les noms de dossiers communs trouvés dans les répertoires uniques, afin de créer un nouvel élément contenant les chemins complets. Donc, de toute façon, après cela, la sortie des cibles est la suivante:

Cible 1:

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

Cible 2:

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

Alors ma question, je suppose ... pourquoi est-ce target1 n'affiche que les répertoires contenant le répertoire avec lequel il est en traitement par lots? Je sais que cela a probablement à voir avec le traitement par lots, mais c'est tout ce que je sais.

Répondre

0

est-il pas

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

Couplé avec

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

qui est à l'origine de la 2 x 2 par opposition à la 1x4

2

Lorsqu'une cible est en lots il exectues indépendamment l'un de l'autre exécutions de la même cible par lot. Ainsi, dans la première exécution que vous peuplaient l'élément FullPath au contenu

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

ensuite sur la deuxième exécution de la cible que vous peuplaient la valeur de FullPath être

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

Puisque les articles ne sont pas visibles à la même cible par lot la deuxième passe ne "voit" pas cet élément FullPath. Mais lorsque TestTarget1 est terminé, les valeurs de FullPath sont combinées en une seule valeur qui est.

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

Est-ce que cela efface? Le traitement par lots peut parfois prêter à confusion.

Voici quelques liens sur batching: