2009-10-01 15 views
8

Estoy tratando de configurar un archivo MSBuild que invocará otro archivo MSBuild y me pregunto cuál es la mejor manera de lograr esto.MSBuild tarea para ejecutar un archivo MSBuild externo

Lo estamos usando en el caso de que un servidor de compilación descargue un archivo MSBuild y luego, según los parámetros, ejecutará el segundo archivo apropiado.

Sé que puedo usar la tarea <Exec Command="msbuild.exe ..." />, pero eso parece ser un poco hacky manera de hacerlo.

¿Existe alguna manera más fácil de usar MSBuild para ejecutar otro archivo MSBuild?

Respuesta

13

Puede usar el MSBuild task para construir un objetivo en otro proyecto de MSBuild.

También puede poner el destino en un archivo .targets externo que es importado por ambos proyectos de MSBuild y usar el CallTarget task para compilarlo.

Actualización: Para ejecutar un comando externo, use el Exec task.

+0

Ahh! Sabía que tenía que haber una mejor manera. No me había encontrado antes con la tarea MSBuild :) –

+1

¿Cómo se usa MSBuild Task para ejecutar un archivo externo? ¿Podría mostrar cómo hacerlo? –

2

Respuesta a la observación de Adam Oren: Aquí hay un ejemplo para ejecutar un archivo externo; en este caso, inicia nunit. El 22% es para escapar, que significa "lo que puede tener espacios en su ruta ejecutable.

<Exec Command="%22$(NUnit_Install_Directory)bin\net-2.0\nunit-console.exe%22 
/noshadow @(TestableAssemblies, ' ') /xml 
$(BuildFilesPath)\NCover-NUnit-Results.xml" /> 

No es necesario utilizar variables como lo hice, pero me parece que hace que sus guiones más portable. $ (NUnit_Install_Directory) se define como

<PropertyGroup> 
    <NUnit_Install_Directory>c:\Program Files\NUnit 2.5.3\</NUnit_Install_Directory> 

7

no es sólo más bonita de usar la tarea <MSBuild> en lugar de <Exec Command="msbuild.exe .."/>. Esto significa que el proceso único de MSBuild sepa acerca de todos los proyectos en construcción, y la no hay colisiones; un proyecto particular no puede ser construido por dos hilos a la vez. Eso suele ser vital si está compilando con "/ m". También existen algunas otras ventajas, como la existencia de un conjunto de registradores para toda la compilación.

0
<Target Name="TA"> 
    <CallTarget Targets="TB"/> 
</Target> 

<Target Name="TB"> 
    <Message Text="TB..." /> 
</Target> 
Cuestiones relacionadas