2012-07-04 11 views
6

Ho una lista di progetti nel mio file MSBuild:Aggiungi MSBuild batch uscita compito come metadati voce

<ItemGroup> 
    <SubProject Include="**\*.csproj" /> 
</ItemGroup> 

Ed ora, vorrei impostare, per ogni progetto, la sua TargetPath in una proprietà di metadati per ciascun progetto.

so già come estrarre il percorso di destinazione per ogni progetto, e messo su una lista elementi separati:

<Target Name="ExtractTargetPaths"> 
    <MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath"> 
     <Output TaskParameter="TargetOutputs" ItemName="SubProjectTargetPath" /> 
    </MSBuild> 
</Target> 

Tuttavia, mi piacerebbe essere in grado di accedere a tale "SubProjectTargetPath" come metadati gli articoli SubProject invece di avere un elenco separato di elementi.

Cioè, invece di scrivere per es. questo:

<SomeTask Parameter="%(SubProjectTargetPath.Identity)" /> 

io sarei in grado di scrivere qualcosa di simile:

<SomeTask Parameter="%(SubProject.TargetPath)" /> 

risposta

5

OK, ho trovato una soluzione, che è quella di utilizzare il dosaggio di destinazione, con una proprietà temporanea:

<ItemGroup> 
    <SubProject Include="**\*.csproj" /> 
</ItemGroup> 

<Target Name="UpdateSubProjectMetadata" Outputs="%(SubProject.Identity)"> 
    <!-- Retrieves the Target DLL path and puts it in the temporary property "_TempTargetPath" --> 
    <MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath"> 
     <Output TaskParameter="TargetOutputs" PropertyName="_TempTargetPath" /> 
    </MSBuild> 

    <!-- Set the metadata item for TestProject to the value of the temporary property --> 
    <ItemGroup> 
     <SubProject Condition="'%(SubProject.Identity)' == '%(Identity)'" > 
      <TargetPath>$(_TempTargetPath)</TargetPath> 
     </SubProject> 
    </ItemGroup> 
    <!-- Clear the temporary property --> 
    <PropertyGroup> 
     <_TempTargetPath></_TempTargetPath> 
    </PropertyGroup> 
</Target> 

Una volta eseguito il target, TargetPath è disponibile su ogni elemento di metadati.

Attuazione nota: Il codice di cui sopra è stato testato solo per MSBuild 4.0 - penso che funziona come è in MSBuild 3.5 e gli utenti di versioni precedenti userebbero i compiti <CreateItem> e <CreateProperty> invece di mettere <PropertyGroup> e <ItemGroup>.

+0

@ImmoLandwerth: Grazie a Immo Landwerth per il suggerimento di modifica (anche se è stato rifiutato - la mia ipotesi è che una modifica suggerita era lo strumento sbagliato per correggere quell'errore). –

Problemi correlati