Эффективное использование свойств проекта Visual Studio для нескольких проектов и конфигураций


Я всегда использовал Visual Studios встроенную поддержку GUI для настройки моих проектов, часто используя таблицы свойств, чтобы несколько проектов использовали общий набор.

одна из моих главных проблем с этим-управление несколькими проектами, конфигурациями и платформами. Если вы просто делаете все с основным графическим интерфейсом (щелкните правой кнопкой мыши проект - > свойства), он быстро становится беспорядком, трудно поддерживать и подвержен ошибкам (например, не удается правильно определить какой-либо макрос или использовать неправильный библиотека времени выполнения и т. д.). Дело в том, что разные люди ставят там библиотеки зависимостей в разных местах (например, мои все живут в "C:Libs[C, C++][lib-name]"), а затем часто управлять различными версиями этих библиотек по-разному (release, debug, x86, x64 и т. д.) Также является большой проблемой, поскольку это значительно усложняет время для его настройки в новой системе, а затем возникают проблемы с контролем версий и сохранением всех путей отдельно...

листы собственность сделать это немного лучше, но я не могу иметь один лист имеет отдельные настройки для разных конфигураций и платформ (раскрывающихся с серым), в результате чего у меня много листов, если наследуется в правильном порядке делать то, что я хочу ("х86", "х64", "отладка", "освобождение", "общие", "каталоги" (касается ранее упомянутых зависимостей вопросу определения пользовательских макросов как BoostX86LibDir), и т. д.) а если наследуется в неправильном порядке (например, "общего" перед "х64" и "отладка") привести к проблемам например, попытка связать неверную версию библиотеки или неверное имя вывода...

Я хочу иметь дело со всеми этими разбросанными зависимостями и настроить набор "правил", которые используются всеми моими проектами в решении,например,называя выходную библиотеку как "mylib-[vc90, vc100]-[x86, x64][-d].lib", без необходимости делать все это для каждого отдельного проекта, конфигурации и комбинации платформ, а затем правильно синхронизировать их все.

Я в курсе переход к совершенно другим системам, таким как CMake, которые создают необходимые файлы, однако это затем усложняет вещи в другом месте, делая его таким образом, даже простые задачи, такие как добавление нового файла в проект, требуют дополнительных изменений в другом месте, что не является чем-то, чем я полностью доволен, если только нет интеграции с VS2010, которая может отслеживать такие изменения.

6 64

6 ответов:

Я только что узнал, что я не думал, что это возможно (он не подвергается GUI), что помогает сделать лист свойств гораздо более полезным. Атрибут "условие" многих тегов в файлах свойств проекта, и он может быть использован в .реквизит файлы, а также!

Я просто собрал следующее в качестве теста,и он отлично работал и выполнял задачу 5 (common,x64,x86,debug, release) отдельных листов свойств!

<?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>

проблема только в том, что свойства GUI не могут обрабатывать он, проект, который использует вышеупомянутый лист свойств, просто сообщает унаследованные значения по умолчанию, такие как" $(ProjectName) " для цели.

Я сделал некоторые улучшения, может быть полезно для кого-то

<?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>

удачи!

у меня была такая же боль для продукта моей компании (200+ проектов) раньше. Я решил ее построить хороший иерархию свойств.

проекты наследуют лист свойств по его типу вывода, скажем x64.Отлаживать.Активный.Библиотека.vsprops по. Этот файл vsprops просто наследует другие листы свойств, используя атрибут InheritedPropertySheets

<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"
    >

вы также можете использовать переменные (т. е. UserMacro, значение которого может быть абсолютным или даже окружение переменные) в таблицах свойств, чтобы настроить много вещей, основанных на ваших потребностях. Например, при определении ОГРН переменной в режиме отладки.vsprops по

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

затем, когда вы устанавливаете имя вывода в серии vsprops, скажем, Output.x64.Библиотека.vsprops по

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

переменная $(BIN) будет расширена до того, что было установлено (в данном случае, Debug). Используя этот метод, вы можете легко построить хорошую иерархию листов свойств для удовлетворения вашего спроса.

Теперь есть еще один то, что вы можете сделать: создайте свои собственные шаблоны проектов, которые используют ваш набор свойств. Реальная трудная часть заключается в обеспечении надлежащего использования шаблонов и таблиц свойств. Мой личный опыт заключается в том, что даже если все настроено, кто-то все равно забудет использовать шаблон для создания новых проектов ...

что касается выходной библиотеки, вы можете выбрать все свои проекты, затем открыть страницы свойств, выбрать все конфигурации, все платформы, а затем установить целевое имя:

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

что давало бы выход, как библиотеки MyLib-твердотельного накопителя V100, если х86-отладка.Либ

мы делаем что-то подобное и для дополнительных библиотечных каталогов, используя $(PlatformName) и #(Configuration) выбрать правильные пути к библиотекам, хотя это означает, что некоторые возиться с начальная настройка библиотек. например, у нас есть boost установить свои библиотеки в boost/lib.Win32 или boost/lib.x64.


что касается библиотек, и люди, устанавливающие их в разных местах, есть несколько вариантов. Если у вас очень надежная система управления версиями, вы можете просто поместить все в систему управления версиями, живя в папке libs рядом с вашим источником. Это, вероятно, не будет работать, если вы используете больше, чем несколько библиотек, Хотя, или если они особенно велики.

другой вариант, который приходит на ум, чтобы установить переменную среды на каждом компьютере пользователя, который указывает на корень их папки библиотек, например LIB_ROOT=c:\libraries, и вы можете получить доступ к этому в Visual Studio как $(LIB_ROOT).

для каждой конфигурации можно создать отдельный лист свойств. Для этого:

  1. создайте лист свойств для конкретной конфигурации
  2. Откройте Диспетчер свойств
  3. щелкните правой кнопкой мыши конфигурация (не проект), который вы хотели бы изменить
  4. Нажмите кнопку "Добавить существующий лист свойств" и добавьте свой лист

это освобождает вас от вставки условий в один лист для нескольких настойки. Если у вас есть некоторые общие атрибуты, которые вы хотели бы разделить между конфигурациями, а затем создать иерархию. Верхний лист может использоваться во всех конфигурациях, а вложенные листы будут содержать только атрибут конфигурации

похоже, что стоит проверить инструмент сборки - у меня дома мы используем пользовательский инструмент, который следит за файлами и проектами для изменений и вычисляет зависимости и порядок компиляции. Добавление нового файла не имеет большого значения-компиляция выполняется с помощью msbuild.

Если бы мне пришлось скомпилировать больше, чем кучу проектов, я бы использовал что-то вроде nant: http://nant.sourceforge.net/