visual-studio - para - visual studio code mejores plugins
¿Qué significan los atributos ''Delimiter'' e ''InheritsFromParent'' en los archivos.vsprops? (3)
Parece que no puedo encontrar ninguna documentación útil de Microsoft sobre cómo se usarían los atributos UserMacro
en el elemento UserMacro
al definir Macros de usuario en archivos de hojas de propiedades .vsprops
para Visual Studio.
Aquí está el uso de la muestra:
<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)/Inc"
InheritsFromParent="TRUE" Delimiter=";"/>
Del ejemplo anterior, supongo que "heredar" realmente significa "a) si la definición no está vacía, luego anexar delimitador, yb) anexar nueva definición" mientras que el comportamiento no heredado sería simplemente reemplazar cualquier macro actual definición. ¿Alguien sabe con seguridad? Mejor aún, ¿alguien tiene alguna fuente sugerida de documentación alternativa para archivos y macros de Visual Studio .vsprops
?
NOTA: esto no es lo mismo que el atributo InheritedPropertySheets
del elemento VisualStudioPropertySheet
, por ejemplo:
<VisualStudioPropertySheet ... InheritedPropertySheets="./my.vsprops">
En este caso, "heredar" significa básicamente "incluir" .
Hay documentación sobre la versión de la interfaz de usuario de esto aquí . Muchos de los archivos XML parecen algo indocumentados, a menudo simplemente dando un archivo de esquema . Su suposición sobre cómo funcionan es más o menos la correcta.
[Respondiendo mi propia pregunta]
InheritsFromParent
significa antepender. Para verificar esto, realicé un experimento que revela cómo funcionan las macros de usuario en Visual Studio 2008. Aquí está la configuración:
- El proyecto
p.vcproj
incluye el archivo de hoja de propiedadesd.vsprops
(''d'' para derivado ) utilizando la etiquetaInheritedPropertySheets
. -
d.vsprops
incluye el archivo de hoja de propiedadesb.vsprops
(''b'' para base ). -
p.vcproj
también define un evento dep.vcproj
que vuelca el entorno. - 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"/>
...
construir la salida
...
ENV=B
OVERRIDE=D
PREPEND=D+B
...
A partir de estos resultados podemos concluir lo siguiente:
-
PerformEnvironmentSet="true"
es necesario para que las macros de usuario se definan en el entorno utilizado para los eventos de compilación. Prueba:NOENV
no se muestra en la salida de compilación. - Las macros de usuario siempre se heredan de las hojas de propiedades incluidas independientemente de
PerformEnvironmentSet
oPerformEnvironmentSet
. Prueba: enb.vsprops
,NOENV
no está configurado en el entorno y end.vsprops
se usa sin necesidad deInheritsFromParent
. - La redefinición simple de una macro de usuario anula cualquier definición previa. Prueba:
OVERRIDE
se establece enD
aunque se definió anteriormente comoB
- La redefinición de una macro de usuario con
InheritsFromParent="true"
antepone la nueva definición a cualquier definición previa, separada por unDelimiter
especificado. Prueba:PREPEND
se establece enD+B
(noD
oB+D
).
Aquí hay algunos recursos adicionales que encontré para la explicación de archivos .vsprops
de Visual Studio y temas relacionados, es de hace unos años pero sigue siendo útil:
entender el sistema de proyectos de VC parte I: archivos y herramientas
comprender el sistema de proyectos de VC parte III: macros, variables de entorno y compartir
comprender el sistema de proyectos de VC, parte IV: propiedades y herencia de propiedades
entender el sistema de proyectos de VC, parte V: construcción, herramientas y dependencias
entendiendo el sistema de proyectos de VC parte VII: proyectos de "makefile" y (re) uso de entornos
No es toda la historia.
- Los delimitadores no son 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 encuentro" porque a nivel de proyecto, no podemos especificar un delimitador y lo que se usa allí es la última hoja de propiedades que especificó la herencia para esa macro)
- Delimiters funciona solo si está hecho de un solo personaje. Un delimitador de más de un carácter puede tener su primer y / o último carácter despojado en algunos casos, en un intento erróneo de "unirse" a la lista de valores.
- $ (Heredar) parece funcionar dentro de macros de usuario. Me gusta para agregado
propiedades, 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) parecen funcionar cuando se usan 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 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 se puede usar una macro de usuario para tomar una instantánea del valor local de (decir) $ (IntDir) en una hoja de propiedades y esperar "burbujear" 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 cargada se ignora (parece evitar que la misma hoja de propiedades tenga agregadas dos macros de usuario)
- Tanto "/" como "/" parecen funcionar en rutas de hoja de propiedades (y en la mayoría de los lugares donde VS espera una ruta).
- Se supone que una ruta de hoja de propiedades que comienza con "/" (después de que se hayan resuelto las macros) está en "./", donde ''.'' es la ubicación de la hoja de llamada / proyecto). Lo mismo si la ruta no comienza con "./", "../" o "unidad: /" (no sé acerca de UNC).