MSBuild pasando parámetros a CallTarget
parameter-passing msbuild-target (4)
Los objetivos de MSBuild no están diseñados para recibir parámetros. En su lugar, utilizan 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 destino varias veces con diferentes parámetros (es decir, implementar varios sitios web). En ese caso, uso la tarea MSBuild MSBuild
y envío 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 secuencia de comandos actual de MSBuild en caso de que no desee enviar "Implementar" a otro archivo.
¡Espero que esto ayude!
Estoy intentando hacer un objetivo reutilizable en mi archivo MSBuild para poder llamarlo varias veces con diferentes parámetros.
Tengo un esqueleto como este:
<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 averiguar cómo permitir que los parámetros se pasen al CallTarget
, y luego, a su vez, al Target
.
Puede ''foreach'' sobre un ItemGroup
con un objetivo, solo que tiene que hacerlo de manera declarativa. Incluso puede tener metadatos adicionales en elementos, como 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>
Usar un grupo de elementos como un valor escalar @(What)
dentro de un objetivo hace el truco, y %(How)
referencia a un elemento de metadatos en un elemento foreach.
Es una forma natural de hacer cosas en msbuild, por ejemplo, puede encontrar este patrón en cualquier lugar en los archivos de proyecto generados con Visual Studio.
Puede haber una mejor manera de hacer esto en MSBuild, pero en Ant, usaría las propiedades globales para llevar la información de una tarea a la siguiente. Fue una mala solución, 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 sea una mejor solución para ti.
<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"/>