2009-04-28 21 views
1

Ich habe dieses Bit eines Msbuild-Projekts, das mich fragt, warum es das Ergebnis ist, wie es ist. Nicht, dass es ein Problem oder etwas Ähnliches verursacht, aber ich würde versuchen, es besser zu verstehen. SoMSBuild: Artikel + Batching + CreateItem + Transforms Frage

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

Ich habe zwei Hauptwege, die einzigartig sind und in jedem Ich habe zwei Verzeichnisse mit den gleichen Namen in jeder der einzigartigen Wege. In target1 binde ich mit der Identität der Elemente in PathDir und führe anschließend eine Transformation für das Element SubDirectory durch, das die allgemeinen Ordnernamen in den eindeutigen Verzeichnissen enthält, um ein neues Element zu erstellen, das die vollständigen Pfade enthält. So irgendwie, danach ist der Ausgang für die Ziele wie folgt:

Ziel 1:

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

Target 2:

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

Also meine Frage, die ich denke, ist ... warum tut target1 zeigt nur die Verzeichnisse an, in denen das Verzeichnis liegt, gegen das es stapelbar ist? Ich weiß, dass es wahrscheinlich mit dem Dosieren zu tun hat, aber das ist alles was ich weiß.

Antwort

0

ist es nicht die

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

mit

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

, die die 2 x 2 verursacht über die 1x4 Gegensatz

2

Wenn ein Ziel es chargiert wird exectues unabhängig von anderen Hinrichtungen desselben targetierten Ziels. So in der ersten Ausführung Sie die FullPath Artikel auf den Inhalt

bevölkerten
C:\RootDir\UniqueDir1\Common1;C:\RootDir\UniqueDir1\Common2 

Dann auf der zweiten Ausführung des Ziel Sie den Wert FullPath bevölkerten

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

werden, da Elemente nicht sichtbar das sind Das gleiche Batch-Ziel. Der zweite Durchlauf "sieht" das FullPath-Objekt nicht. Wenn das TestTarget1 jedoch abgeschlossen ist, werden die Werte für FullPath in einem einzelnen Wert kombiniert, der lautet.

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

Ist das klar? Batching kann manchmal etwas verwirrend sein.

Hier sind einige Links auf batching: