2009-10-01 28 views
57

Estoy tratando de hacer un objetivo reutilizable en mi archivo MSBuild para que pueda llamarlo varias veces con diferentes parámetros.Parámetros que pasan MSBuild a CallTarget

Tengo un esqueleto de esta manera:

<Target Name="Deploy"> 
    <!-- Deploy to a different location depending on parameters --> 
</Target> 

<Target Name="DoDeployments"> 
    <CallTarget Targets="Deploy"> 
     <!-- Somehow indicate I want to deploy to dev --> 
    </CallTarget> 

    <CallTarget Targets="Deploy"> 
     <!-- Somehow indicate I want to deploy to testing --> 
    </CallTarget> 
</Target> 

pero no puedo encontrar la manera de permitir que los parámetros que se pasarán en el CallTarget, y luego a su vez la Target sí.

Respuesta

69

Los objetivos de MSBuild no están diseñados para recibir parámetros. En cambio, usan las propiedades que usted define para ellos.

<PropertyGroup> 
    <Environment>myValue</Environment> 
</PropertyGroup> 

<Target Name="Deploy"> 
    <!-- Use the Environment property --> 
</Target> 

Sin embargo, un escenario común es invocar un Target varias veces con diferentes parámetros (es decir Implementar varios sitios web). En ese caso, yo uso la tarea de MSBuild MSBuild y enviar los parámetros como propiedades:

<Target Name="DoDeployments"> 
    <MSBuild Projects ="$(MSBuildProjectFullPath)" 
      Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)" 
      Targets="Deploy" /> 

    <MSBuild Projects ="$(MSBuildProjectFullPath)" 
      Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)" 
      Targets="Deploy" /> 
</Target> 

$(MSBuildProjectFullPath) es la ruta completa de la corriente de secuencia de comandos de MSBuild en caso de que no desee enviar "Implementar" a otro archivo.

Espero que esto ayude!

1

Puede haber una forma mejor de hacerlo en MSBuild, pero en Ant, utilizaría las propiedades globales para llevar la información de una tarea a la siguiente. Fue una solución pésima, pero no vi una mejor manera en ese momento. Debería poder hacer esto en MSBuild, pero tenga en cuenta que necesitará usar la tarea CreateProperty para asignar dinámicamente una propiedad.

Por otro lado, es bastante fácil implementar tareas en C# (o VB o lo que sea). Tal vez esa es una mejor solución para ti.

1
<CreateProperty 
     Value="file1"> 
     <Output 
      TaskParameter="Value" 
      PropertyName="filename" /> 
    </CreateProperty> 
    <CallTarget Targets="Deploy"/> 
    <Message Text="$(filename)"/> 
    <CreateProperty 
     Value="file2"> 
     <Output 
      TaskParameter="Value" 
      PropertyName="filename" /> 
    </CreateProperty> 
    <Message Text="$(filename)"/> 
    <CallTarget Targets="Deploy"/> 
+2

CreateProperty ha sido privado en V4. Use PropertyGroup dentro de un Target en su lugar. Ref: http://msdn.microsoft.com/en-us/library/ms171458.aspx – WooWaaBob

17

Puede 'foreach' a través de una ItemGroup con un objetivo, solamente hay que hacerlo de manera declaritive. Incluso puede tener metadatos adicionales en los puntos, al igual que en el ejemplo de código:

<ItemGroup> 
    <What Include="Dev"> 
     <How>With bugs</How> 
    </What> 
    <What Include="Test"> 
     <How>With tests</How> 
    </What> 
    <What Include="Chicken"> 
     <How>Deep fried</How> 
    </What> 
</ItemGroup> 

<Target Name="Deploy"> 
    <Message Text="@(What), %(How)" /> 
</Target> 

El uso de un grupo de artículos como un valor escalar @(What) dentro de un objetivo hace el truco, y %(How) hace referencia a un elemento de metadatos en un elemento foreach.

Es una forma natural de hacer las cosas en msbuild, por ejemplo, puede encontrar este patrón en todas partes en los archivos de proyecto generados con Visual Studio.

Cuestiones relacionadas