2011-05-02 5 views
16

La historia hasta ahora

Tengo una buena solución con un proyecto de aplicación de escritorio, un par de proyectos de biblioteca, y un par de proyectos de herramientas de desarrollo (también aplicaciones de escritorio). Por el momento, mi servidor de compilación emite todo el código en uno OutputPath. Así que terminamos con¿Por qué MSBuild no compilará un proyecto con un punto en el nombre?

drop-x.y.z\ 
    Company.MainApplication.exe  <-- main application 
    Company.MainApplicationCore.dll <-- libraries 
    Helper.exe      <-- developer tools 
    Grapher.exe 
    Parser.exe 
    ...        <-- the rest of the output 

Pero, estamos creciendo y las personas fuera de nuestro equipo quieren acceso a nuestras herramientas. Entonces quiero organizar la salida. Decidí que lo que nosotros queremos es una diferente OutputPath por proyecto ejecutable

drop-x.y.z\ 
    Company.MainApplication\ 
    Company.MainApplication.exe  <-- main application 
    Company.MainApplicationCore.dll <-- libraries 
    ...        <-- application specific output 
    Helper\ 
    Helper.exe      <-- developer tools 
    ...        <-- tool specific output 
    Grapher\ 
    Grapher.exe 
    ... 
    Parser\ 
    Parser.exe 
    ... 

lo que hice

me encontré con este simple comando. Me gusta porque conserva todo el contexto Solution-dir de Solution que hace que msbuild sea un problema.

msbuild /target:<ProjectName> 

Por ejemplo, la raíz de mi solución como un directorio de trabajo, que yo llamaría

PS> msbuild /target:Helper /property:OutputPath="$pwd\out\Helper" 

Estoy probando esto desde PowerShell, por lo que $pwd resuelve la ruta completa al directorio de trabajo, o la raíz de la solución en este caso. Obtengo la salida que deseo.

Sin embargo, cuando ejecuto este comando

PS> msbuild /target:Company.MainApplication /property:OutputPath="$pwd\out\Company.MainApplication" 

me sale el siguiente salida de error (no hay más información, me encontré con /verbosity:diagnostic)

El objetivo "Company.MainApplication" no existir en el proyecto.


lo que necesito

el comando falla en cualquier proyecto con un punto o puntos en el nombre. Intenté con muchas combinaciones de directorios y propiedades de trabajo. Intenté varias formas de escapar de los valores de la propiedad. También intenté ejecutar el comando desde un <Task> en un archivo de objetivos.

necesito saber ya sea
A) ¿Cómo solucionar este comando para trabajar la propiedad
B) ¿Cómo lograr el mismo resultado con una mínima fricción

Respuesta

28

Intente utilizar un guion bajo como un carácter de escape para el punto en el parámetro de destino, p.

msbuild /target:Company_MainApplication /property:OutputPath="$pwd\out\Company.MainApplication" 
+6

Aprecio esta _correcta_ respuesta en gran medida, pero ¿por qué? ¿Por qué es esta la respuesta? –

+3

¡Buena pregunta! La razón por la que lo sé es porque todas las propiedades del sistema en TeamCity que se pasan a MsBuild utilizan el guión bajo en lugar del punto. Por ejemplo, {build.vcs.number.1} en Ant se convierte en $ (build_vcs_number_1) en MsBuild. Quizás MSFT simplemente decidió que el punto debería convertirse en un carácter reservado, debido a la sintaxis de las referencias de grupo de elementos, p. % myItem.filename% –

-1

El interruptor /targets: es identificar un <Target para ejecutar en el archivo de proyecto. Debe proporcionar su archivo .csproj como un argumento que es no con el prefijo /xx marcador de opción.

Es posible que también desee trabajar según el archivo .sln. En ese caso, aún no especifique el proyecto en .sln para compilar de esta manera. Lo dejo para buscar la sintaxis correcta en caso de que eso sea lo que termine haciendo.

+0

la respuesta aceptada en esta [thread] (http://social.msdn.microsoft.com/Forums/pl-PL/msbuild/thread/86064955-c55b-4157-a242-9c34389b9fd9) que indicaría que Estoy en lo cierto al usar el modificador '/ target: ProjectName'. –

+0

Nota: con la raíz de la solución como el directorio de trabajo, este comando 'msbuild/target: ProjectName' es el mismo que' msbuild MySolution.sln/target: ProjectName' –

+0

@AnthonyMastrean Muy tarde gracias por los comentarios; Acepto que [la respuesta de Dan Nolan es correcta] (https://stackoverflow.com/a/5907177/11635). Nunca había oído hablar de este mecanismo (había leído bastantes artículos y el libro de Hashimi en ese momento). Si alguien puede encontrar un enlace al documento, lo agradecería. –

Cuestiones relacionadas