Efektywne wykorzystanie właściwości projektu Visual Studio do wielu projektów i konfiguracji

Zawsze używałem Visual Studios wbudowanego w obsługę GUI do konfigurowania moich projektów, często używając arkuszy właściwości tak, aby kilka projektów używało wspólnego zestawu.

Jednym z moich głównych problemów jest zarządzanie wieloma projektami, konfiguracjami i platformami. Jeśli po prostu zrobić wszystko z głównym GUI (kliknij prawym przyciskiem myszy projekt - > właściwości) szybko staje się bałagan, trudne do utrzymania i podatne na błędy (jak nie poprawnie zdefiniować niektóre makro, lub za pomocą niewłaściwego środowiska uruchomieniowego biblioteki, itp.). Radzenie sobie z tym, że różni ludzie umieszczają tam biblioteki w różnych miejscach (np. moje wszystkie mieszkają w "C:\Libs\[C, C++]\[lib-name]\"), a następnie często zarządzać różnymi wersjami tych bibliotek w inny sposób, jak również (release, debug, x86, x64, itp) jest również duży problem, ponieważ znacznie komplikuje czas, aby skonfigurować go na nowym systemie, a następnie są problemy z kontrolą wersji i utrzymanie wszystkich ścieżek oddzielnie...

Arkusze właściwości sprawiają, że trochę lepiej, ale nie mogę mieć jeden arkusz mają oddzielne ustawienia dla różnych konfiguracji i platform (rozwijane pola są szare), w wyniku czego mam wiele arkuszy, które jeśli dziedziczone w odpowiedniej kolejności zrobić to, co chcę ("x86", "x64", "debug", "release", "common", "katalogi" (zajmuje się wcześniej wspomnianym problemem zależności przez definiowanie makr użytkownika jak BoostX86LibDir), itp) i jeśli dziedziczone w złej kolejności (np "common" przed "x64" i "debug") prowadzić do takich problemów jak próba połącz niepoprawną wersję biblioteki lub niepoprawnie nazwaj wyjście...

To, czego chcę, to sposób radzenia sobie z tymi wszystkimi rozproszonymi zależnościami i skonfigurowanie zestawu "reguł", które są używane przez wszystkie moje projekty w rozwiązaniu, jak nazwanie biblioteki wyjściowej jako " mylib-[vc90, vc100]-[x86, x64] [- d].lib", bez konieczności robienia tego wszystkiego dla każdego indywidualnego projektu, konfiguracji i kombinacji platformy, a następnie utrzymywania ich wszystkich w prawidłowej synchronizacji.

Jestem świadomy przeprowadzki do całkowicie różne systemy, takie jak CMake, które tworzą potrzebne pliki, jednak to komplikuje sprawy gdzie indziej, dzięki czemu nawet proste zadania, takie jak dodanie nowego pliku do projektu, wymagają dodatkowych zmian w innym miejscu, co nie jest czymś, z czego jestem całkowicie zadowolony, chyba że istnieje jakaś integracja VS2010, która może śledzić tego rodzaju zmiany.

Author: CharlesB, 2010-08-17

6 answers

Właśnie dowiedziałem się, że coś, o czym myślałem, że nie jest możliwe (nie jest narażone przez GUI), co pomaga uczynić arkusz właściwości znacznie bardziej użytecznym. Atrybut "Condition" wielu tagów w plikach właściwości projektu i może być używany w .pliki rekwizytów również!

Po prostu ułożyła następujące jako test i zadziałało świetnie i wykonało zadanie 5 (common,x64,x86,debug,release) oddzielnych arkuszy właściwości!

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

Jedynym problemem jest GUI właściwości nie może obsłużyć, projekt który używa powyższego arkusza właściwości tylko raportuje domyślne odziedziczone wartości, takie jak "$(ProjectName) " dla celu.

 73
Author: Fire Lancer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-17 14:50:53

Zrobiłem kilka ulepszeń, może się komuś przydać

<?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>
Baw się dobrze!
 25
Author: lunicon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-04 06:36:28

Wcześniej miałem ten sam ból z powodu produktu mojej firmy (ponad 200 projektów). Sposób, w jaki to rozwiązałem, to zbudowanie ładnej hierarchii arkuszy właściwości.

Projekty dziedziczą arkusz właściwości według jego typu wyjściowego, powiedzmy x64.Debugowanie.Dynamiczny.Biblioteka.vsprops. Ten plik vsprops po prostu dziedziczy inne arkusze właściwości za pomocą atrybutu 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"
    >

Można również użyć zmiennych (np. UserMacro, których wartość może być bezwzględna lub nawet zmienna środowiskowa) we właściwości arkusze, aby dostosować wiele rzeczy w zależności od potrzeb. Na przykład definiowanie zmiennej BIN w debugowaniu.vsprops

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

Następnie, gdy ustawisz nazwę wyjścia w serii vsprops, powiedzmy, Output.x64.Biblioteka.vsprops

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

Zmienna $(BIN) zostanie rozwinięta do tego, co zostało ustawione (w tym przypadku Debug). Użyj tej techniki można łatwo skonstruować ładną hierarchię arkuszy właściwości, aby spełnić swoje wymagania.

Teraz jest jeszcze jedna rzecz, którą możesz chcieć zrobić: Zbuduj swój własny szablony projektów wykorzystujące zestaw arkuszy właściwości. Naprawdę trudną częścią jest wymuszenie właściwego użycia szablonów i arkuszy właściwości. Moje osobiste doświadczenie jest takie, że nawet jeśli wszystko jest ustawione, ktoś i tak zapomni użyć szablonu do tworzenia nowych projektów ...

 10
Author: Peon the Great,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-11 00:50:55

Jeśli chodzi o bibliotekę wyjściową, możesz wybrać wszystkie projekty, a następnie wyświetlić strony właściwości, wybrać wszystkie konfiguracje, wszystkie platformy, a następnie ustawić docelową nazwę na:

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

Co daje wyjście takie jak mylib-v100-x86-Debug.lib

Robimy coś podobnego również dla dodatkowych katalogów bibliotecznych, używając $(PlatformName) i #(Configuration), aby wybrać właściwe ścieżki bibliotek, chociaż oznacza to pewne zamieszanie w początkowej konfiguracji bibliotek. eg mamy boost zainstalować jego libs boost/lib.Win32 lub boost/lib.x64.


Jeśli chodzi o biblioteki i ludzi instalujących je w różnych miejscach, istnieje kilka opcji. Jeśli masz bardzo solidny system kontroli źródeł, możesz po prostu umieścić wszystko w source control, żyjąc w folderze libs obok źródła. To prawdopodobnie nie zadziała, jeśli użyjesz więcej niż kilku bibliotek lub jeśli są one szczególnie duże.

Inną opcją, która przychodzi na myśl, jest ustawienie środowiska zmienna na każdym komputerze użytkownika, który wskazuje na główny folder swoich bibliotek, np LIB_ROOT=c:\libraries, a następnie można uzyskać do niego dostęp w Visual Studio jako $(LIB_ROOT).

 4
Author: ngoozeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-17 13:43:01

Dla każdej konfiguracji można utworzyć osobny arkusz właściwości. Aby to zrobić:

  1. Utwórz arkusz właściwości specyficznych dla konfiguracji
  2. Otwórz zarządcę nieruchomości
  3. Kliknij prawym przyciskiem myszy konfigurację (nie projekt), którą chcesz zmodyfikować
  4. Kliknij "Dodaj istniejący arkusz właściwości" i dodaj swój arkusz

To zwalnia cię z wstawiania warunków do jednego arkusza dla wielu konfiguracji. Jeśli u pacjenta występują częste atrybuty, które chcesz udostępnić między konfiguracjami, a następnie utworzyć hierarchię. Górny arkusz może być używany we wszystkich konfiguracjach, a zagnieżdżone arkusze będą zawierały tylko specyficzny dla konfiguracji atrybut

 4
Author: gogisan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 18:34:10

Wygląda na to, że warto sprawdzić narzędzie do budowania-u mnie używamy niestandardowego narzędzia, które śledzi pliki i projekty pod kątem zmian i wylicza zależności i kolejność kompilacji. Dodanie nowego pliku to nic wielkiego - kompilacja odbywa się za pomocą msbuild.

Gdybym miał skompilować więcej niż kilka projektów użyłbym czegoś takiego jak nant: http://nant.sourceforge.net/

 0
Author: Rune Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-13 19:03:38