2008-10-24 43 views
22

Tengo una tarea de MSBuild para construir un proyecto específico en un archivo de solución. Se ve algo como esto:MSBuild: especificando un destino desde la línea de comando

<Target Name="Baz"> 
    <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" /> 
</Target> 

Desde la línea de comandos, puedo poner mi BuildCmd a cualquiera Rebuild o Clean y funciona como se esperaba:

msbuild/target: Baz/propiedad: BuildCmd = reconstruir MyMsbuildFile.xml msbuild/target: Baz/propiedad: BuildCmd = MyMsbuildFile.xml Limpio

Pero qué palabra lo uso para establecer BuildCmd t o para simplemente construir? Intenté Build y Compile y simplemente lo dejé en blanco o indefinido, pero siempre recibo un error.

msbuild/target: Baz/propiedad: BuildCmd = Construir MyMsbuildFile.xml Foo.sln: error MSB4057: El objetivo de "barra: Construir" no existe en el proyecto.

msbuild/target: Baz/property: BuildCmd = Compilar MyMsbuildFile.xml Foo.sln: error MSB4057: El objetivo "barra: Compilar" no existe en el proyecto.

msbuild/target: Baz MyMsbuildFile.xml Foo.sln: error MSB4057: La "barra:" de destino no existe en el proyecto.

Respuesta

21

entendí que se quiere construir un objetivo con un comando específico: Construir, limpio, etc.

Ésta es la forma en que lo haría.

Crear una propiedad para recibir el comando de construcción, cuando no se especifica valores predeterminados para construir

<PropertyGroup> 
    <BuildCmd Condition=" '$(BuildCmd)' == ''">Build</BuildCmd> 
</PropertyGroup> 

Después, crear el destino que se iniciará MSBuild con el destino especificado en el parámetro:

<Target Name="Stackoverflow"> 
    <MsBuild Projects="Foo.sln" Targets="$(BuildCmd)" /> 
</Target> 

A continuación, llame a su archivo MSBuild con el objetivo y el parámetro BuildCmd de la siguiente manera:

msbuild msbuild.xml /t:Stackoverflow /p:BuildCmd=Clean 

Solo asegúrese de que el destino exista en la solución o el archivo del proyecto.

+1

Estoy tratando de construir solo un proyecto específico dentro de Foo.sln. –

+0

Ver mi respuesta a continuación. –

+0

"Solo asegúrese de que el destino exista en la solución o el archivo del proyecto". ¿Cómo se agrega un objetivo personalizado a un archivo sln? –

-7

Simplemente edite el archivo sln usted mismo y descubra que MSBuild es una sintaxis muy fácil, solo busque objetivos.

+3

El archivo .sln no está en la sintaxis de MSBuild. –

6

Desde: http://msdn.microsoft.com/en-us/library/ms164311.aspx

/target: objetivos

construye estas metas en este proyecto. Use un punto y coma o una coma para separar múltiples objetivos, o especifique cada objetivo por separado./t también es aceptable. Por ejemplo: /objetivo: Recursos para la compilación;

+7

El problema es especificar qué hacer con cada objetivo: compilar, reconstruir, limpiar. Parte del problema es que el término "objetivo" se usa en la línea de comando para especificar un objetivo dentro del archivo msbuild, y nuevamente para especificar qué proyecto construir dentro de un archivo de solución (colisión del espacio de nombres). –

0

Utilizando la plantilla de CheGueVerra, me ocurrió con la siguiente solución:

<PropertyGroup> 
    <ProjBuildCmd Condition="'$(BuildCmd)' != 'Build'">:$(BuildCmd)</ProjBuildCmd> 
    <SolnBuildCmd Condition="'$(BuildCmd)' != 'Build'">$(BuildCmd)</SolnBuildCmd> 
</PropertyGroup> 

Y a continuación, en lugar de utilizar $(BuildCmd) directamente, utilizo $(ProjBuildCmd) o $(SolnBuildCmd) así:

<!-- Build the 'bar' project only --> 
<Target Name="Baz"> 
    <MSBuild Projects="Foo.sln" Targets="bar$(ProjBuildCmd)" /> 
</Target> 

<!-- Build the whole solution --> 
<Target Name="Baz2"> 
    <MSBuild Projects="Foo.sln" Targets="$(SolnBuildCmd)" /> 
</Target> 
+1

Esta solución no funciona para VS10 . ¿Tienes alguna actualización sobre esto? – Mike

2

La clave es condicionar la propiedad BuildCmd.

<Target Name="Baz"> 
    <PropertyGroup> 
    <BuildCmd Condition="'$(BuildCmd)' != ''">:$(BuildCmd)</BuildCmd> 
    </PropertyGroup> 
    <MSBuild Projects="Foo.sln" Targets="bar$(BuildCmd)" /> 
</Target> 

De esta forma, si Limpiar o Reconstruir están configurados, se agregan dos puntos. Si no se agrega nada, BuildCmd simplemente estará en blanco, de forma predeterminada en el objetivo de compilación.

Nota - El grupo de propiedades debe residir en el destino, o será anulado cuando lo especifique en la línea de comando.

Cuestiones relacionadas