2009-05-08 27 views
29

tengo dos problemas similares:variable de macros/Medio Ambiente en .sln y archivos .vcproj para Visual Studio

a) Tengo una solución que incluye varios proyectos y yo quiero ser capaz de cambiar fácilmente la ubicación del proyecto mediante el establecimiento de algunos variable de entorno/macro. Como ejemplo, este proyecto puede ubicarse en \ SolutionDir \ Dir1 \ o \ SolutionDir \ Dir2 \ Por lo tanto, deseo especificar que debe estar ubicado en \ SolutionDir \ $ (Var) y simplemente establecer la variable.

¿Hay alguna compilación en Visual Studio para hacerlo?

Conozco actualmente solo dos soluciones: edite .sln file manual/programmatically para encontrar este proyecto y establecer la ruta correcta.

No pude usar la variable de entorno en el archivo .sln.

b) Tengo un proyecto que incluye archivos de recursos (.rc y .h). Quiero ser capaz de establecer su ubicación a través de otra variable de entorno o macro.

Algo así como \ ProjectDir \ $ (var2) \ resource.rc

he encontrado algo de información sobre las hojas de propiedades prometedoras, pero Visual Studio no se expande macros cuando los estoy usando en la etiqueta del archivo en el .vcproj .

Gracias por cualquier idea sobre cómo resolver este problema.

Saludos, Victor

+0

interesante. Pero no puedo entender por qué quieres hacer esto. Probablemente haya una forma diferente de resolver el problema que intentas abordar. – Tim

+0

Quiero configurar el proyecto para que sea fácilmente conmutable entre las versiones de marca del producto para diferentes OEM. –

Respuesta

17

creo que tengo el mismo objetivo que tú: Yo desea utilizar variables de entorno para localizar algunos proyectos en un archivo de solución (.sln) y utilizar algunas variables de entorno para localizar algunos archivos dentro de mis proyectos

he encontrado una manera de hacer eso y funciona muy bien para mí (con Visual Studio 2005): - editar el archivo .sln con un editor de texto y utilizar variables de entorno con la siguiente sintaxis% MyEnvironmentVariable% - editar el .vcproj archiva y reemplaza la ruta a los archivos deseados con algunas variables, con la siguiente sintaxis $ (MyEnvironmentVariable).

creo que sirve ... Cyrille

+1

Esto es justo lo que estaba buscando, no lo sabía.sln usa% VAR% sintaxis, he estado usando $ (VAR) que funciona en .scproj. ¡Gracias! – watbywbarif

+0

Tenga en cuenta que la introducción de variables en un archivo .sln significa que no se pueden usar con MSBuild. Consulte Consulte https://connect.microsoft.com/VisualStudio/feedback/details/690318/msbuild-doesnt-parse-environment-variables-in-sln-files – cowlinator

2

La mejor manera de lograr lo que usted describe en b) es el uso de hojas de propiedades. Echa un vistazo también a este muy similar question.

me encontré con algo de información prometedora sobre hojas de propiedades, pero Visual Studio no se expande macros cuando estoy usando en la etiqueta del archivo en el .vcproj.

No estoy seguro de qué versión de VS utiliza. VS2008 le permite definir, por ejemplo, un directorio de inclusión como este: "$ (OpenCVInclude) \ cxcore \ include". Lo uso todo el tiempo. OpenCVInclude es una macro definida en una hoja de propiedades.

En cuanto a la pregunta a), creo que no hay una forma "limpia" de hacer lo que quiera. Como alternativa, puede configurar el administrador de configuración:

  • Incluya todos los proyectos en la solución.
  • Nombre el proyecto de manera diferente, por ejemplo, basado en el OEM.
  • Para cada proyecto, defina las configuraciones de liberación y depuración en la solución
  • En "Build-> Configuration Manager" Puede marcar o desmarcar la columna "Crear" para cada configuración. Verifique "compilación" para el proyecto relevante.
0

(a) Cyrille ofrece una solución decente a lo que usted solicitó. Otra forma es mantener sus configuraciones cambiables en un lugar común. Tenga en cuenta que esto no funcionará para archivos que no sean msbuild como * .sln y * .vcproj (hasta VS 2010).

archivos del proyecto: ... $ (ChangeableDir) \ foo.cs

Common.targets: ChangeThis ...

Sin embargo, yo no' Creo que esta es una gran manera de hacer las cosas. Si las diferencias entre lo que está creando son grandes piezas de funcionalidad, debería considerar crear una sucursal en su sistema de control de origen. OTOH, si las diferencias son menores, por ejemplo, cadenas codificadas, esto lleva a su segunda pregunta ...

(b) El tipo de gestión de recursos que describe es esencialmente el mismo problema que enfrentan las personas que localizan su proyecto en diferentes idiomas Por suerte, el apoyo directo está integrado en Visual Studio desde 2005. Echa un vistazo a las preguntas anteriores como: Localization in Visual Studio 2008

21

sólo tiene que utilizar la variable de entorno en el campo correspondiente:

OutputDirectory="$(MyEnvVariableName)\Bin" 

Un truco es que se necesita para reiniciar el Visual Studio IDE cada vez que cambie la variable.

Hay un artículo de MSDN precisamente en esto: How to: Use Environment Variables in a Build

1

No estoy seguro de si usted está construyendo sólo ++ proyectos de C o si también está construyendo proyectos de C# \ VB, pero una de las mejores cosas de Visual Studio es todos los proyectos son realmente solo proyectos de MSBuild. Si edita un proyecto en un editor de texto, verá que al final del proyecto importa un archivo .targets. Si realiza un seguimiento y encuentra las importaciones, encontrará que casi todos los proyectos VS importan Microsoft.Common.Targets. Microsoft.Common.Targets importa Custom.Before.Microsoft.Common.Targets. Al usar esta importación, puede importar su propio archivo de objetivos con sus propias acciones personalizadas.

Por ejemplo, tengo un archivo de destino que tiene una propiedad común definida en todos los proyectos en una solución y un evento de creación de publicación personalizada que se procesa al final de cada construcción del proyecto.

Usando este método de extensión y creando configuraciones personalizadas en la solución además de la versión estándar \ depuración, debería poder crear una configuración de compilación tan compleja como lo necesite.

Cuestiones relacionadas