10

En Visual Studio 2003, intento establecer una variable de entorno en el evento de preconstrucción que luego se usará en el paso de compilación, pero el valor no Parece que se propaga. Por ejemplo, si el evento pre-compilación contiene este (ya sea directamente o dentro de un archivo por lotes):Configuración de variables de entorno en el evento de preconstrucción y uso en el paso de compilación

set MY_LIB_VERSION=1.0.0 

y AdditionalIncludeDirectories tiene esta:

c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include 

entonces yo esperaría que la compilación funcione si el my_lib_v1.0.0 existe el directorio. Pero en cambio, me sale

 
c:\path\to\prog\my_prog.c(22) : fatal error C1083: Cannot open include file: 'my_lib.h' 
Project : warning PRJ0018 : The following environment variables were not found: 
$(MY_LIB_VERSION) 

que deducir que la variable de entorno establecido en caso de pre-construcción, por lo tanto no se propaga al paso de compilación, pero puedo estar perdiendo algo.

¿Cómo puedo establecer la variable de entorno en el evento de preconstrucción y usarlo en el paso de compilación?

(Alternativamente, otras maneras sensibles de la definición de una versión de la biblioteca una vez y usarlo varias veces para AdditionalIncludeDirectories y AdditionalLibraryDirectories harían igual de bien.)


actualización: Terminé la solución de nuestra problema de una manera diferente. Estamos utilizando Subversion, y configuramos la propiedad svn:externals en un subdirectorio del origen del proyecto llamado dependencies, de modo que una salida del proyecto verifique adicionalmente <svn_path>\libraries\my_lib_v1.0.0 y llámelo dependencies\my_lib en la copia de trabajo. Entonces la configuración del proyecto podría referirse a dependencies\my_lib\include y similares. La actualización a la versión 1.0.1 de my_lib es simplemente una cuestión de edición de la propiedad svn:externals; no es necesario cambiar la configuración del código y del proyecto.

+0

A partir de Windows 7 (por lo que parece) existe el comando 'SETX' para almacenar variables de entorno persistentemente. Fuente: http://ss64.com/nt/setx.html – bassim

Respuesta

4

Try Es posible que desee investigar esta herramienta: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html

Lo usamos todo el tiempo para manejar las variables de entorno en nuestro entorno de construcción.

+0

Gracias. He instalado el complemento y funciona para mí. Sin embargo, no estoy seguro de si puedo convencer a todos nuestros desarrolladores para que lo instalen ellos mismos, ya que tendrá que hacerse en todas las máquinas de desarrollo para ser confiable en toda la compañía. –

+0

Parece que un complemento como este es la única manera de editar las variables de entorno propias de Visual Studio, así que aceptaré esta respuesta aunque no sea algo que pueda aplicar en nuestra empresa. –

+0

Este complemento es excelente y, hasta donde yo sé, es la única solución para agregar env var de forma dinámica. Pero tenga en cuenta que las líneas en sus archivos que contienen los archivos env no deben exceder 2048 caracteres (hay un carácter feo [2048] en el código fuente del complemento). – Grokwik

4

Debo admitir que nunca he intentado establecer variables de entorno en un paso previo a la compilación, y puedo ver por qué no necesariamente funcionaría (ejecutar un archivo por lotes probablemente desencadenaría un proceso separado, mientras que querría manipular el entorno del proceso principal).

Una solución que he estado usando, pero que solo funcionará cuando pueda determinar la configuración necesaria antes de iniciar Visual Studio, es crear un archivo por lotes que establezca las variables de entorno necesarias y luego inicie Visual Studio con el archivo de solución. He reproducido el esqueleto de este archivo por lotes a continuación:

REM 
REM Set up VS environment with defaults (this is for 2008) - need to do this first 
REM 
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" 
REM 
REM Set the environment variables required by the project 
REM 
set BOOST_BASE=C:\Boost\include\boost-1_35 
REM 
REM If you need to manipulate the path, do it here 
REM 
REM 
REM Finally, start VS with the appropriate solution file 
REM 
devenv MyProjectWithBoost.sln 
+0

Gracias por la solución. Sabríamos el número de versión por adelantado, pero realmente quiero integrarlo en la compilación estándar para que la versión de la biblioteca sea correcta ya sea que el desarrollador use el IDE o la línea de comandos. ¡No tengo el poder de hacer que todo el equipo use un script especial! –

3

Las variables de entorno que se configuran mediante el comando SET son temporales y sólo duran el tiempo de vida del proceso en el que se establecen. Inmediatamente caducan cuando el proceso expira, y no pueden ser vistos por otros procesos.

Un evento de preconstrucción de Visual Studio es un proceso separado. Una vez que ese proceso expira, la variable de entorno deja de serlo.

¿Estás seguro de que las variables de entorno son lo que quieres? ¿Podría hacer esto al establecer un valor en un archivo de texto que se encuentra en una ubicación de red central?

EDIT: Si realmente desea cambiar persistentemente las variables de entorno en Windows, puede hacerlo pero implicará llamar a algunas API de Windows en lugar de simplemente llamar a SET. P.ej. http://code.activestate.com/recipes/416087/

googlear environment variable windows persisting

+0

Lo principal que quiero hacer es tener un archivo de texto de las versiones de la biblioteca, y tener AdditionalIncludeDirectories dependiendo de los valores en el archivo de texto, sin requerir que cada desarrollador recuerde ejecutar un script especial antes de la compilación. ¡No estoy seguro de que las variables de entorno sean lo que quiero! –

Cuestiones relacionadas