2012-07-04 16 views
6

tengo una lista de proyectos en mi archivo de MSBuild:Añadir MSBuild dosificado salida de la tarea como metadatos elemento

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

Y ahora, me gustaría establecer, en cada proyecto, su TargetPath en una propiedad de metadatos para cada proyecto.

que ya sé cómo extraer la ruta de destino para cada proyecto, y lo puso en una lista de elementos separados:

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

Sin embargo, me gustaría ser capaz de acceder a esa "SubProjectTargetPath" como metadatos en los artículos SubProject en lugar de tener una lista separada de artículos.

Es decir, en lugar de escribir, p. esto:

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

yo sería capaz de escribir algo como:

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

Respuesta

5

OK, he encontrado una solución, que consiste en utilizar la dosificación de destino, con una propiedad temporal:

<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 vez que ese objetivo se ha ejecutado, TargetPath está disponible en cada elemento de metadatos.

Nota de implementación: El código anterior sólo se prueba para MSBuild 4.0 - Creo que funciona tal como se muestran en MSBuild 3.5, y los usuarios de las versiones anteriores usarían los <CreateItem> y <CreateProperty> tareas en vez de poner <PropertyGroup> y <ItemGroup>.

+0

@ImmoLandwerth: Gracias a Immo Landwerth por la sugerencia de edición (aunque fue rechazada, supongo que una edición sugerida fue la incorrecta para corregir ese error). –

Cuestiones relacionadas