2008-09-27 10 views
6

Me parece que no puede encontrar ninguna utilidad la documentación de Microsoft acerca de cómo se podría utilizar los Delimiter y InheritsFromParent atributos en el elemento UserMacro para definir comandos de usuario en archivos de hoja de propiedad .vsprops para Visual Studio.¿Qué significan los atributos 'Delimiter' e 'InheritsFromParent' en los archivos .vsprops?

Aquí hay ejemplos de uso:

<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc" 
    InheritsFromParent="TRUE" Delimiter=";"/> 

En el ejemplo anterior, supongo que "heredan" realmente significa "a) si la definición es no vacía a continuación, anexar delimitador, y b) añadir nueva definición " donde como el comportamiento no heredado sería simplemente reemplazar cualquier definición de macro actual. ¿Alguien sabe con seguridad? Mejor aún, ¿alguien tiene alguna fuente sugerida de documentación alternativa para los archivos y macros de Visual Studio .vsprops?

NOTA: esto es no el mismo que el atributo InheritedPropertySheets del elemento VisualStudioPropertySheet, por ejemplo:

<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops"> 

En este caso "heredan" básicamente significa "incluyen".

Respuesta

8

[responder a mi propia pregunta]

InheritsFromParent significa anteponer. Para comprobar esto, hice un experimento que revela cómo Macros de usuario funcionan en Visual Studio 2008. Aquí está la disposición:

  • Proyecto p.vcproj incluye el archivo de hoja de propiedades d.vsprops ('d' para deriva) usando la etiqueta InheritedPropertySheets .
  • d.vsprops incluye el archivo de hoja de propiedades b.vsprops ('b' para base de.)
  • p.vcproj define también un Evento Pre-Build que vuelca el medio ambiente.
  • Ambos archivos .vsprops contienen definiciones de macro de usuario.

b.vsprops

... 
<UserMacro Name="NOENV" Value="B"/> 
<UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/> 
<UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/> 
... 

d.vsprops

... 
<VisualStudioPropertySheet ... InheritedPropertySheets=".\b.vsprops"> 
<UserMacro Name="ENV" Value="$(NOENV)" PerformEnvironmentSet="true"/> 
<UserMacro Name="OVERRIDE" Value="D" PerformEnvironmentSet="true"/> 
<UserMacro Name="PREPEND" Value="D" InheritsFromParent="true" 
    Delimiter="+" PerformEnvironmentSet="true"/> 
... 

p.vcproj

... 
<Configuration ... InheritedPropertySheets=".\d.vsprops"> 
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/> 
... 

resultados de generación

... 
ENV=B 
OVERRIDE=D 
PREPEND=D+B 
... 

De estos resultados se puede concluir lo siguiente:

  1. PerformEnvironmentSet="true" es necesario para Macros de usuario que se definirán en el entorno utilizado para la construcción eventos. Prueba: NOENV no se muestra en la salida de compilación.
  2. Macros de usuario son siempre heredado de las hojas de propiedades incluidos independientemente de PerformEnvironmentSet o InheritsFromParent. Prueba: en b.vsprops, NOENV no está configurado en el entorno y en d.vsprops se usa sin necesidad de InheritsFromParent.
  3. redefinición simple de una macro de usuario reemplaza cualquier definición anterior. Prueba: OVERRIDE se establece en D aunque se definió anteriormente como B.
  4. Redefinición de una macro de usuario con InheritsFromParent="true"antepone la nueva definición a cualquier definición anterior, separadas por un especificado Delimiter. Prueba: PREPEND se establece en D+B

Éstos son algunos recursos adicionales que he encontrado para la explicación de Visual Studio .vsprops archivos y temas relacionados, que es de hace unos años, pero todavía es útil (no D o B+D.):

understanding the VC project system part I: files and tools

understanding the VC project system part II: configurations and the project property pages dialog

understanding the VC project system part III: macros, environment variables and sharing

understanding the VC project system part IV: properties and property inheritance

understanding the VC project system part V: building, tools and dependencies

understanding the VC project system part VI: custom build steps and build events

understanding the VC project system part VII: "makefile" projects and (re-)using environments

0

Hay documentación en la versión de interfaz de usuario de este here. Muchos de los archivos XML parecen algo indocumentados, a menudo simplemente dando un schema file. Su suposición sobre cómo funcionan es más o menos la correcta.

0

No es toda la historia.

  • Delimitadores no heredados. Solo la lista de elementos que delimitan se hereda: las mismas macros de usuario pueden tener diferentes delimitadores en diferentes hojas de propiedades, pero solo se utiliza el último delimitador encontrado. (Escribo "último encontrado" porque a nivel de proyecto, no podemos especificar un delimitador y lo que se utiliza allí es la última hoja de propiedades que especificó la herencia para esa macro)
  • Delimitadores solo funciona si está hecho de un solo carácter .Un delimitador más largo que un carácter puede tener su primer carácter y/o último carácter eliminado en algunos casos, en un intento erróneo para "unirse" a la lista de valores.
  • $ (Heredar) parece funcionar dentro de las macros de usuario . Al igual que para las propiedades agregadas
    , funciona como un marcador de posición para
    los valores de los padres, y puede aparecer varias veces. Cuando no se encuentra $ (Heredar), está implícito al principio si se establece el indicador de herencia.
  • $ (NoInherit) también parece funcionar en las macros del usuario (hace que VC se comporte como si la casilla no estuviera marcada).
  • Las macros de usuario (y algunas integradas) aparecen en cuando se utilizan para construir una ruta de hoja de propiedades (el propio convertidor de proyecto de VC usa esa característica). El valor tomado por las macros del usuario en esta situación no es , siempre es intuitivo, especialmente si se redefine en otras hojas de propiedades incluidas.
  • En general, lo que se "hereda" o concatena son fórmulas y no valores (es decir, no puede usar una macro de usuario para tomar una instantánea del valor local de (decir) $ (IntDir) en una hoja de propiedades y esperar " aumente "ese valor a través de la herencia, porque lo que se hereda es en realidad la fórmula" $ (IntDir) ", cuyo valor eventualmente se resolverá a nivel de proyecto/configuración/archivo).
  • una hoja de propiedades ya cargado se ignora (parecen evitar que la misma hoja de propiedades tiene sus macros de usuario agregadas dos veces)
  • Tanto "/" y "\" aparecerá para trabajar en recorridos de hojas propiedad (y en la mayoría lugares donde VS espera un camino).
  • Se asume que una ruta de hoja de propiedades que comienza con "/" (después de resolver las macros) está en "./", donde '.' es la ubicación de la hoja/proyecto de llamada ). Lo mismo si la ruta no comienza con "./", "../" o "unidad: /" (no sé acerca de UNC).
Cuestiones relacionadas