Pregunta

Estoy tratando de hacer un objetivo reutilizable en mi MSBuild presento por lo que se puede llamar varias veces con diferentes parámetros.

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í mismo.

¿Fue útil?

Solución

Los objetivos de MSBuild no están diseñados para recibir parámetros. En su lugar, utilizan las propiedades que defina 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!

Otros consejos

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 @(What) escalar dentro de un objetivo hace el truco, y %(How) hace referencia a un elemento de metadatos en un elemento foreach.

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

Puede haber una mejor manera de hacer esto en MSBuild, pero en hormiga, me gustaría utilizar las propiedades globales para llevar información de una tarea a la siguiente. Era una solución mal, pero no vi una mejor forma en el momento. Usted debe ser capaz de hacer esto en MSBuild, pero hay que tener en cuenta que tendrá que utilizar el CreateProperty tarea de asignar dinámicamente una propiedad.

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

    <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"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top