2011-05-25 12 views
5

tengo una propiedad proyecto de C# denominado Versión define comoEl uso de un equipo variable de entorno de la ciudad para anular una propiedad proyecto

<Version Condition="$(Version)==''">1.2.3.4<Version> 

1.2.3.4 es el valor predeterminado.

Tengo una propiedad del sistema Team City, también llamada Versión, configurada para anular. Entonces en el diálogo de ejecución personalizada en Team City, puedo especificar un valor para la Versión y ese valor se usa. Esto funciona bien

Si dejo el parámetro en blanco en Team City, sin embargo, el valor predeterminado aún se sobrescribe con blanco (nulo?). Si borro el parámetro Team City, se usa el valor predeterminado.

¿La condición es incorrecta? ¿Cómo puedo configurar la propiedad Team City para que esté en blanco, y solo anular si ingreso algún valor?

Respuesta

6

respuesta actualiza después el comentario de OP:

a partir de documentos:

MSBuild le permite configurar las propiedades desde la línea de comandos utilizando el modificador de línea de comandos /propiedad o/p. Los valores de propiedad recibidos desde la línea de comando anulan los valores de propiedad establecidos en el archivo de proyecto y la propiedad valores heredados de las variables de entorno .

lo que sólo puede establecer una propiedad $ (VersionTC) en la configuración TeamCity y comprobar si esa propiedad está vacía o no, y configurar la versión

<Version>$(VersionTC)<Version> 
<Version Condition="'$(VersionTC)'==''">1.2.3.4<Version> 

(por lo que se establece Version-VersionTC primero. Luego ver si está vacío y establezca el valor predeterminado)

Eche un vistazo a este blog post explicando todo esto.


intentar algo como a continuación:

<Version Condition=" '$(Version)'=='' ">1.2.3.4<Version> 

Tome nota de la ' ' (comillas simples) alrededor $(Version)

+0

gracias, eso no pareció ayudar – jbemt48

+0

@Spider M9 - eso fue solo por claridad. ¿No notó el '' '' adicional que rodea $ (Versión)? – manojlds

+0

@ jbemt48 - He actualizado mi respuesta – manojlds

4

Equipo de la Ciudad es probable que aún pasando el parámetro en la línea de comandos, sólo con un valor en blanco , como en,

/p:Version="" 

o algo si milar. El síntoma que está viendo se debe a cómo MSBuild se ocupa de las propiedades anuladas. Cuando se especifica en una línea de comando, una propiedad tomará ese valor independientemente de que también se declare en una declaración de grupo de propiedades estática (global en el archivo, no dentro de un destino). Por lo tanto, su declaración de Versión, con la condición que se verifica para la cadena vacía, se omite por completo.

Una forma de evitar esto es mover su PropertyGroup que contiene la declaración de $ (Versión), con su Condición, dentro del objetivo donde se usa por primera vez. MSBuild permitirá sobrescribir el valor de una propiedad de línea de comando desde una propiedad "dinámica" creada en tiempo de ejecución desde un destino.

Si ejecuta esta línea de comandos ...

> msbuild My.proj /t:Ver /p:Version="" 

... y tienen este objetivo ...

<Target Name="Ver"> 
    <PropertyGroup> 
    <Version Condition="'$(Version)' == ''">1.2.3.4<Version> 
    </PropertyGroup> 
    <Message Text="Version: '$(Version)'" /> 
</Target> 

... usted conseguirá la versión 1.2.3.4 mostrando, mientras con PropertyGroup fuera del objetivo, retendrá el valor vacío.

+0

y no funcionará incluso si se mueve dentro del objetivo a menos que use . Ver mi respuesta actualizada – manojlds

+0

Mover un PropertyGroup dentro de un destino es la sintaxis equivalente 4.0 para la tarea CreateProperty ahora (casi) obsoleta. Y funcionará, pruébalo! –

Cuestiones relacionadas