Jak warunkowo wdrożyć aplikację.config oparty na konfiguracji build?

Mam trzy niestandardowe konfiguracje budowania { Dev, Qs, Prd}. Tak, mam trzy aplikacje configs { Dev.config, Qs.config, Prd.config }. Wiem jak edytować .plik csproj do wypisania poprawnego na podstawie bieżącej konfiguracji kompilacji.

<Target Name="AfterBuild">
   <Delete Files="$(TargetDir)$(TargetFileName).config" />
   <Copy SourceFiles="$(ProjectDir)$(Configuration).config" DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>

Mój problem polega na tym, że muszę mieć sześć zbudować konfiguracje { Dev, Qs, Prd } x {Debug, Release }. Muszę wspierać ustawienia debugowania i wydawania (optymalizacje, pdb, itp.) dla każdego środowiska. Jednak wartości konfiguracji aplikacji nie zmiana pomiędzy debugowaniem/wydaniem.

Jak zachować skrypt kompilacji tak ogólny, jak to możliwe i używać tylko trzech konfiguracji aplikacji? Nie chcę kodować zbyt wielu ciągów warunkowych.

Author: Anthony Mastrean, 2008-12-08

5 answers

Coś w stylu

<PropertyGroup Condition="'$(Configuration)'=='Dev_Debug' OR '$(Configuration)'=='Dev_Release'" >
    <CfgFileName>Dev</CfgFileName>
</PropertyGroup>
<!-- similar for Qs & Prd -->
<Target ...>...$(CfgFileName).config...
 6
Author: Brian,
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
2008-12-08 18:45:55

Naprawiliśmy to używając elementu Choose w pliku csproj. Mamy kilka różnych konfiguracji skonfigurowanych, więc wszystko, co robimy, to upuść ten blok do pliku proj i możesz użyć konfiguracji VS, aby ci pomóc. Chcę poprzeć radę Roba, aby przenieść zdaną aplikację.config. Od jakiegoś czasu podążam w tym kierunku.

  <Choose>
<When Condition=" '$(Configuration)' == 'Debug' ">
  <ItemGroup>
    <None Include="App.config" />
    <None Include="Release\App.config" />
  </ItemGroup>
</When>
<Otherwise>
  <ItemGroup>
    <None Include="Release\App.config">
      <Link>App.config</Link>
    </None>
  </ItemGroup>
</Otherwise>

 9
Author: Steve Severance,
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
2008-12-08 21:40:02

Sugeruję, aby twoje pytanie ujawniło, że wyrosłeś app.config - nadszedł czas, aby przejść do lepszego rozwiązania i rozpocząć rozwiązywanie niektórych powiązanych problemów.

Po pierwsze, nigdy nie należy automatycznie wdrażać pliku konfiguracyjnego do produkcji i należy oczekiwać, że personel wsparcia operacyjnego stanowczo odrzuci każdą próbę zrobienia tego. Oczywiście, jeśli jesteś personelem wsparcia operacyjnego, powinieneś sam go odrzucić. Zamiast tego, twoje wydanie powinno zawierać niektóre Instrukcja ręcznej aktualizacji pliku konfiguracyjnego z przykładową ilustracją. Konfiguracja produkcji jest zbyt ważna dla mniejszych środków, chyba że po prostu nie cenisz swojego systemu produkcyjnego.

Podobnie jest w testowych i innych środowiskach, ale w mniejszym stopniu, więc naprawdę potrzebujesz tylko swojego app.config zaludnionego dla własnej pracy programistycznej.

Opcją jest osadzenie wielu konfiguracji w jednym app.config, co jest rozsądne dla małych, stosunkowo nieistotne Aplikacje lub we wczesnych stadiach rozwoju/wydania. Na przykład utwórz ustawienie konfiguracyjne o nazwie target-env, które zawiera wartość używaną w kodzie do wybierania innych ustawień konfiguracyjnych, na przykład poprzez dołączenie wartości do kluczy innych ustawień konfiguracyjnych.

Preferuję przejść obok app.config całkowicie, lub użyć go minimalnie. W tym przypadku, wolę umieścić tylko tyle danych konfiguracyjnych do pliku, aby umożliwić mi aplikacja / system, aby połączyć się z jego bazą danych, a następnie umieścić pozostałe szczegóły konfiguracji w specjalnej tabeli bazy danych w tym celu. Ma to wiele zalet, takich jak uświadomienie bazy danych jakie środowisko reprezentuje (dev, test, produkcja, itp.) i utrzymanie konfiguracji i innych danych razem. Pakiet wdrożeniowy może być następnie właściwie utrzymywany w tajemnicy w odniesieniu do konfiguracji i różnic w środowisku-kod po prostu uzyskuje dostęp do swoich danych konfiguracyjnych i działa w związku z tym ten sam pakiet wdrożeniowy jest dobry dla każdego środowiska.

Jednak kluczowym czynnikiem sukcesu tego podejścia jest to, że kod aplikacji musi "wiedzieć", czego oczekuje od konfiguracji i musi "wiedzieć", aby odrzucić niewłaściwą / niekompletną konfigurację. Tutaj powinieneś spędzać czas, nie próbując obejść granic app.config.

To zwykle oznacza utworzenie własnej klasy do dostępu do danych konfiguracyjnych, a następnie użycie tej klasy w całym zamiast aplikacji. Prowadzi to również do wielu innych korzyści, takich jak mocno wpisane dane konfiguracyjne: zamiast String, zwróć DateTime, lub Url, lub Integer, lub Currency, lub cokolwiek, co najlepiej pasuje do danych konfiguracyjnych i aplikacji.

 1
Author: Rob Williams,
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
2008-12-08 19:30:25

A co powiesz na użycie serwera build?
Minęło dużo czasu odkąd pracowałem w. NET, ale nie możesz użyć serwera Hudson (- podobnego) do zarządzania konfiguracjami kompilacji? Czy nie jest łatwiej?
A co z NAnt? Nie pasuje do Twoich potrzeb?

 1
Author: Nimrod Shory,
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
2009-12-28 17:55:41

Ostatnim rozwiązaniem, które chciałbym zastosować, jest utworzenie 6 konfiguracji aplikacji, 1 na konfigurację niestandardową

{ Dev_Debug.config, Dev_Release.config, Qs_Debug.config, ... , Prd_Release.config }.

Chociaż, z tą konfiguracją, mogłem utrzymać ogólny skrypt budowania, nie używając żadnych łańcuchów warunkowych.

 0
Author: Anthony Mastrean,
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
2008-12-08 18:26:18