Siempre he usado Visual Studios, construido en el soporte de la GUI para configurar mis proyectos, a menudo utilizando las hojas de propiedades, de modo que varios proyectos se utilizan un conjunto común.

Uno de mis principales quejas con esto es la gestión de múltiples proyectos, configuraciones y plataformas. Si usted acaba de hacer todo con la interfaz gráfica de usuario principal (haga clic derecho en el proyecto -> propiedades) rápidamente se convierte en un lío, difícil de mantener y propenso a errores (como la incapacidad para definir correctamente algunos macro, o la utilización incorrecta de biblioteca de tiempo de ejecución, etc). Lidiando con el hecho de que diferentes personas puestas allí dependencia de las bibliotecas en diferentes lugares (por ejemplo, la mina de todos vivimos «C:\Libs\[C,C++]\[lib-nombre]\») y, a continuación, a menudo gestionar las diferentes versiones de las bibliotecas de manera diferente (de liberación, de depuración, x86, x64, etc) es también un gran problema, ya que complica enormemente el tiempo para ponerlo en un nuevo sistema y, a continuación, hay problemas con la versión de control y mantenimiento de todos los caminos separados…

Hojas de propiedades hacen de este un poco mejor, pero no puedo tener una hoja tienen configuraciones distintas para las diferentes configuraciones y plataformas (el desplegable de casillas de un color gris), lo que resulta en que yo tenga muchas hojas que si hereda en el orden correcto hacer lo que yo quiero («x86», «x64», «debug», «liberación», «común», «directorios» (ofertas con la ya mencionada dependencia problema mediante la definición de macros de usuario como BoostX86LibDir), etc) y si hereda en el orden incorrecto (por ejemplo, «común» antes de «x64» y «debug») conducen a problemas como tratando de vincular una incorrecta versión de la biblioteca, o incorrectamente nomenclatura de la salida…

Lo que yo quiero es una manera de lidiar con todos estos dispersos dependencias y el establecimiento de un conjunto de «reglas» que son utilizados por todos mis proyectos en la solución, como nombrar a una biblioteca de salida como «mylib-[vc90,vc100]-[x86,x64][-d].lib», sin tener que hacer todo esto para cada proyecto individual, de la configuración y de la plataforma de combinación y, a continuación, mantenga todos ellos correctamente sincronizados.

Soy consciente de movimiento totalmente diferentes, como los sistemas de CMake que crear los archivos necesarios, sin embargo, esto luego complica las cosas en otros lugares por lo que es así que incluso las tareas más sencillas como la adición de un nuevo archivo al proyecto requiere de cambios adicionales en otros lugares, que no es algo que me estoy completamente satisfecho con cualquiera, a menos que haya algunos con VS2010 integración en el que se puede mantener un seguimiento de este tipo de cambios.

  • Siento su dolor: contamos con más de 600 vcproj de nuestro producto en el trabajo. 🙁
InformationsquelleAutor Fire Lancer | 2010-08-17

6 Comentarios

  1. 77

    Me acabo de enterar de algo, yo no creo que sea posible (no es la expuesta por la interfaz gráfica de usuario) que ayuda a hacer la hoja de propiedades mucho más útil. La «Condición» atributo de muchas de las etiquetas en el proyecto de propiedad de los archivos y puede ser utilizado en la .props archivos así!

    Acabo de poner la siguiente como una prueba y funcionó muy bien y hicieron la tarea de 5 (común,x64,x86,de depuración,de liberación) separar las hojas de propiedades!

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Label="UserMacros">
        <!--debug suffix-->
        <DebugSuffix Condition="'$(Configuration)'=='Debug'">-d</DebugSuffix>
        <DebugSuffix Condition="'$(Configuration)'!='Debug'"></DebugSuffix>
        <!--platform-->
        <ShortPlatform Condition="'$(Platform)' == 'Win32'">x86</ShortPlatform>
        <ShortPlatform Condition="'$(Platform)' == 'x64'">x64</ShortPlatform>
        <!--toolset-->
        <Toolset Condition="'$(PlatformToolset)' == 'v90'">vc90</Toolset>
        <Toolset Condition="'$(PlatformToolset)' == 'v100'">vc100</Toolset>
      </PropertyGroup>
      <!--target-->
      <PropertyGroup>
        <TargetName>$(ProjectName)-$(Toolset)-$(ShortPlatform)$(DebugSuffix)</TargetName>
      </PropertyGroup>
    </Project>

    Único problema es que las propiedades de la GUI no puede lidiar con ello, un proyecto que utiliza la anterior propiedad hoja de informes predeterminados valores heredados como «$(Nombreproyecto)» para el destino.

    • Bonito técnica!
    • +1 esto es muy similar a lo que yo uso
    • Sí, hojas de propiedades son mucho más potentes en VS2k10. Una pena que ninguno de los que está expuesto a través de la IDE. Yo he hecho algo similar y la verdad es que simplifica las cosas.
    • Si necesita más avanzadas funciones de Cadena de caracteres, puede utilizar el Sistema.Métodos String: msdn.microsoft.com/en-us/library/… Ejemplo: `<ShortHasRelPos>$(de Configuración.ToLower().LastIndexOf(‘rel’))</ShortHasRelPos>
    • ¿Cómo puedo aplicar esta solución? Donde debo decirlo, y ¿cómo puedo dejar de Visual Studio sabes me gustaría que se utiliza en un defecto de la moda?
    • Nunca he hecho como un «defecto», porque podría estropear con proyectos que no son de mi propia (por ejemplo, la 3ª parte de las bibliotecas y proyectos de muestra) aunque no es el valor predeterminado de la propiedad hojas almacenado en algún lugar (olvidar) se podría modificar. Como tal, acabo de poner en mi de la solución de directorio, a continuación, en el Visual Studio «Administrador de la Propiedad» de la ventana, usted puede simplemente utilizar «Add existing Hoja de propiedades» (también se pueden crear otros nuevos que hay, pero la interfaz gráfica de usuario todavía no proporciona ningún medio para hacer Plataforma básica/Configuración de los condicionales en las hojas de propiedades). Esto también funciona con varios devs / control de código fuente correctamente.

  2. 27

    He hecho algunas mejoras, puede ser útil para alguien

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Label="UserMacros">
    <!--IsDebug: search for 'Debug' in Configuration-->
    <IsDebug>$([System.Convert]::ToString( $([System.Text.RegularExpressions.Regex]::IsMatch($(Configuration), '[Dd]ebug'))))</IsDebug>
    <!--ShortPlatform-->
    <ShortPlatform Condition="'$(Platform)' == 'Win32'">x86</ShortPlatform>
    <ShortPlatform Condition="'$(Platform)' == 'x64'">x64</ShortPlatform>
    <!--build parameters-->
    <BUILD_DIR>$(registry:HKEY_CURRENT_USER\Software\MyCompany\@BUILD_DIR)</BUILD_DIR>
    </PropertyGroup>
    <Choose>
    <When Condition="$([System.Convert]::ToBoolean($(IsDebug)))">
    <!-- debug macroses -->
    <PropertyGroup Label="UserMacros">
    <MyOutDirBase>Debug</MyOutDirBase>
    <DebugSuffix>-d</DebugSuffix>
    </PropertyGroup>
    </When>
    <Otherwise>
    <!-- other/release macroses -->
    <PropertyGroup Label="UserMacros">
    <MyOutDirBase>Release</MyOutDirBase>
    <DebugSuffix></DebugSuffix>
    </PropertyGroup>
    </Otherwise>
    </Choose>
    <Choose>
    <When Condition="Exists($(BUILD_DIR))">
    <PropertyGroup Label="UserMacros">
    <MyOutDir>$(BUILD_DIR)\Bin\$(MyOutDirBase)_$(ShortPlatform)\</MyOutDir>
    <MyIntDir>$(BUILD_DIR)\Build\$(Configuration)_$(ShortPlatform)_$(PlatformToolset)\$(ProjectGuid)\</MyIntDir>
    </PropertyGroup>
    </When>
    <Otherwise>
    <PropertyGroup Label="UserMacros">
    <MyOutDir>$(SolutionDir)\Bin\$(MyOutDirBase)_$(ShortPlatform)\</MyOutDir>
    <MyIntDir>$(SolutionDir)\Build\$(Configuration)_$(ShortPlatform)_$(PlatformToolset)\$(ProjectGuid)\</MyIntDir>
    </PropertyGroup>
    </Otherwise>
    </Choose>
    <PropertyGroup>
    <OutDir>$(MyOutDir)</OutDir>
    <IntDir>$(MyIntDir)</IntDir>
    <!-- some common for projects
    <CharacterSet>Unicode</CharacterSet>
    <LinkIncremental>false</LinkIncremental>
    --> 
    </PropertyGroup>
    </Project>

    divertirse!

    • Eres…una locura. Pero en una buena forma 🙂
    • Cuándo se va a evaluar? Cuando se carga el proyecto? Me gustaría añadir custom post-construir reglas copia a una hoja de propiedades para copiar sólo los archivos Dll que realmente se han vinculado al proyecto. ¿Crees que esto sería posible?
    • Bim, creo que es evaluado antes de construir, como leer las variables de registro (ver $(registro:clave)).
  3. 11

    Yo tenía el mismo dolor por el producto de mi empresa (200+ proyectos) antes. La forma en que lo resuelto es construir una buena jerarquía de las hojas de propiedad.

    Los proyectos hereda la hoja de propiedades por su tipo de salida, decir x64.De depuración.Dinámica.Biblioteca.vsprops. Este archivo vsprops simplemente hereda de otras hojas de propiedades mediante el InheritedPropertySheets atributo

    <VisualStudioPropertySheet
    ProjectType="Visual C++"
    Version="8.00"
    Name="x64.Debug.Dynamic.Binary"
    InheritedPropertySheets=".\Common.vsprops;.\x64.vsprops;.\Debug.vsprops;.\Runtime.Debug.Dynamic.vsprops;.\Output.x64.Library.vsprops"
    >

    También puede utilizar variables (es decir, UserMacro, cuyo valor puede ser absoluta o incluso variables de entorno) en las hojas de propiedades para personalizar un montón de cosas en función de su necesidad. Por ejemplo, la definición de un BIN variable en la Depuración.vsprops

    <UserMacro name="BIN" Value="Debug" />

    entonces cuando se establece el nombre de la salida en la serie de vsprops, digamos, de Salida.x64.Biblioteca.vsprops

    <VisualStudioPropertySheet
    ProjectType="Visual C++"
    Version="8.00"
    OutputDirectory="$(BIN)"
    >

    El $(BIN) variable será expandido a lo que se ha establecido (en este caso, Depuración). El uso de esta técnica, usted puede construir fácilmente una buena jerarquía de las hojas de propiedades para satisfacer su demanda.

    Ahora hay una cosa más que usted puede ser que desee hacer: construir su propio proyecto de templates que utiliza su hoja de propiedades de conjunto. El real parte difícil es hacer uso adecuado de las plantillas y hojas de propiedades. Mi experiencia personal es que, incluso si todo está configurado, alguien todavía se olvide de utilizar la plantilla para crear nuevos proyectos …

  4. 5

    Es posible crear una hoja de propiedades independientes para cada configuración. Para hacer esto:

    1. Crear una configuración específica de la hoja de propiedades
    2. Abrir el Administrador de la Propiedad
    3. Derecho haga clic en el configuración (no el proyecto) que desea modificar
    4. Haga clic en «Add existing Hoja de propiedades» y agregar a su hoja de

    Esto alivia de la inserción de condiciones en una sola hoja para varias configuraciones. Si usted tiene algunos atributos comunes que te gustaría compartir entre las configuraciones, a continuación, crear una jerarquía. La parte superior de la hoja se puede utilizar en todas las configuraciones y el anidado de las hojas sólo contendrá la configuración específica de atributo

    • PERFECTO! gracias. Así que usted también puede crear páginas nuevas en cada nodo de configuración. Muy fácil caer en la trampa de la edición de la página compartida de que los efectos de todas las configuraciones, incluso a pesar de que es accesible en cada una de las configuraciones de nodo.
  5. 4

    Hasta la salida de la biblioteca se va, usted puede seleccionar todos sus proyectos, luego abrir las páginas de propiedades, seleccione Todas las Configuraciones, Todas las Plataformas y, a continuación, establezca el Nombre de Destino a:

    $(ProjectName)-$(PlatformToolset)-$(PlatformShortName)-$(Configuration)

    que daría una salida como mylib-v100-x86-Debug.lib

    Hacemos algo similar a este para de Biblioteca Adicionales subdirectorios, utilizando $(PlatformName) y #(Configuration) para escoger el derecho de la biblioteca de caminos, aunque esto no significa que algunos jugando con la configuración inicial de las bibliotecas. por ejemplo tenemos impulsar instalar sus librerías para boost/lib.Win32 o boost/lib.x64.


    Con respecto a las bibliotecas, y la gente de la instalación de ellos en diferentes lugares, hay un par de opciones. Si usted tiene un muy robusto sistema de control de origen, usted puede poner todo en el control de código fuente, que viven en una carpeta libs junto a su fuente. Que probablemente no funcionará si usted usa más de un par de bibliotecas, aunque, o si son particularmente grandes.

    La otra opción que viene a la mente es establecer una variable de entorno de cada usuario de la máquina que apunta a la raíz de su carpeta de bibliotecas, por ejemplo, la LIB_ROOT=c:\libraries, y usted puede entonces tener acceso a que en Visual Studio como $(LIB_ROOT).

    • Ya he hecho algunos trozos como esto un poco, pero luego hay bibliotecas que utilizar algo más en sus nombres (por ejemplo, optar en lugar de la liberación, -d en lugar de Depurar), etc, que aún requiere una gran cantidad de reglas especiales (mi depurar.los apoyos y la liberación.props configurar macros de usuario para ayudar con esta comunes.props estableciendo realmente el include/lib caminos). No había considerado que con el impulso, buena idea (ser incluso mejor si hay vinculación automática incluido no con los mismos nombres para x86 y x64 construye, pero el impulso.construir personas no parecen pensar que es un problema)
    • Supongo que su PlatformShortName vino de un x86.accesorios y x64.los accesorios que deben ser correctamente heredado o algo o es sólo indocumentados?
    • Lancer: para ser honesto, no estoy seguro de dónde PlatformShortName viene. Creo que debe ser un built-in, porque no tenemos nada de especial en nuestras hojas de propiedades.
    • Cortamos el impulso de la acumulación de secuencia de comandos para incluir la plataforma en el lib-nombre. Eso requiere que nos la costumbre de tener un boost_version.h pero vinculación automática funciona como un encanto, sólo tenemos que agregar la boost.props archivo a un proyecto y estamos listos para ir. Por supuesto, había conocido acerca de las condiciones en accesorios archivos que podría haber sido una mejor manera de ir.. Definitivamente menos doloroso..
  6. 0

    Suena como que podría ser digno de la comprobación hacia fuera una herramienta de creación – en mi lugar utilizamos un encargo de la herramienta que los relojes de archivos y proyectos para los cambios y las cifras de las dependencias y para compilar. Añadir un nuevo archivo no es la gran cosa – compilación se hace con msbuild.

    Si tuve que compilar más que un montón de proyectos que me gustaría usar algo como nant:
    http://nant.sourceforge.net/

Dejar respuesta

Please enter your comment!
Please enter your name here