2011-03-11 4 views

Respuesta

16

En realidad, puede usar una variación en el enfoque de Ritch con configuraciones de proyectos comunes. Esencialmente lo que tiene que hacer un solo cambio en el final de cada archivo de proyecto en su solución:

<PropertyGroup Condition="'$(SolutionDir)' == '' or 
        '$(SolutionDir)' == '*undefined*'"> 
     <SolutionDir>..\..\</SolutionDir> 
    </PropertyGroup> 
    <Import Project="$(SolutionDir)CommonSettings.targets" /> 
    </Project> 

A continuación, puede definir CommonSettings.targets para contener los ajustes a nivel de la solución.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
      ToolsVersion="3.5"> 
     <PropertyGroup> 
      <TacoBuild>true</TacoBuild> 
     </PropertyGroup> 
    </Project> 

Básicamente, a menos que desee anular o fusionar la configuración del proyecto ya definida en cada proyecto. El siguiente enlace explica cómo hacerlo con cierto detalle.

http://www.ademiller.com/blogs/tech/2007/12/common-project-settings-for-your-visual-studio-solution/

+0

Ese es un enfoque inteligente. Tendré que agregar esa a mi caja de herramientas. –

+0

Tenga en cuenta que, en mis intentos (con Visual Studio 2012 Express) para establecer DefineConstants de esta manera para varios proyectos, pude hacer que se compilara correctamente, pero Visual Studio no conocía las definiciones y, por lo tanto, la coloración de sintaxis era incorrecta para # if/#endif bloques de código. – yoyo

+0

Esta forma de hacer la definición no parece funcionar para mí, pero la solución de Tim debajo de la suya parece funcionar. ¿Alguna idea de por qué? – gnychis

6

Indirectamente allí. Si se establece una variable de entorno con una bandera y ejecutar VS:

set TacoBuild=true 
devenv.eve bigproject.sln 

o lanzar MSBuild desde la línea de comandos:

msbuild /p:TacoBuild=true 

En sus archivos Csproj es necesario agregar un PropertyGroup:

<PropertyGroup Condition="'$(TacoBuild)'=='true'"> 
    <DefineConstants>$(DefineConstants);TacoBuild</DefineConstants> 
</PropertyGroup> 

En su código se necesita un preprocesador def:

#if TacoBuild 
    const int myConst = 42; 
#endif 

Una alternativa VS solamente es definir una definición de preprocesador en la configuración de compilación para una nueva configuración de proyecto y usar esa configuración en su compilación.

Una solución que no es MSBuild consiste en crear un archivo constants.cs y escribir una herramienta de configuración personalizada que actualice el archivo cs. Ojalá hubiera una solución mejor, pero no he encontrado ninguna.

+0

el problema es que sólo puede hacerlo a través de línea de comandos, pero yo quiero ser capaz de poner en marcha un IDE, defina el 'constant', y ejecute la construcción de depuración F5 para esto. – Graviton

+0

@Graviton: si vas a utilizar el IDE, ¿por qué no creas un proyecto con un único archivo constants.cs que incluya todos los proyectos en la solución? De todos modos, me referí a cómo usar la técnica publicada con el IDE. –

11

que tienen otro enfoque para hacer esto:

  1. Editar archivo de configuración mundial. Por ejemplo, en mi caso es .netcf2.0, por lo que es $(MSBuildBinPath)\microsoft.compactframework.csharp.targets.

    Añadir la siguiente línea:

    <Import Project="$(SolutionDir)CommonSettings.targets" Condition="exists('$(SolutionDir)CommonSettings.targets')" /> 
    

    Esto es para decir MSBuild importar los CommonSettings.targets si ha existido en la carpeta de solución.

  2. Cree CommonSettings.targets en su carpeta de soluciones.

    Por ejemplo, para definir ABC símbolo:

    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
        <PropertyGroup> 
        <DefineConstants>$(DefineConstants);ABC</DefineConstants> 
        </PropertyGroup> 
    </Project> 
    
+0

No modifique un archivo de "sistema". En su lugar, modifique el archivo de proyecto que depende de la bandera de la misma manera que lo hizo, ya que es una buena manera. De ahí mi +1. – Softlion

+0

existe 'Condición =" ('...') "' es lo que hace que esta sea la respuesta correcta. crea un archivo de propiedades común con un nombre similar a la solución, por lo que una solución diferente no lo tendrá y no lo cargará. –

Cuestiones relacionadas