Jak wybrać inną aplikację.config dla kilku konfiguracji build

Mam projekt typu dll, który zawiera testy integracyjne MSTest. Na mojej maszynie testy przechodzą i chcę, aby to samo działo się na serwerze CI (używam TeamCity). Ale testy nie, bo muszę dostosować niektóre ustawienia w aplikacji.config. Dlatego myślałem, aby mieć oddzielną drugą aplikację.plik konfiguracyjny zawierający ustawienia serwera CI.

Więc chciałbym mieć

/Sln
 /Proj
  app.config (I think this is required by VS)
  app.Release.config (This is a standalone independent config file)

Więc jeśli wybieram Release configuration w Build config NA CI, chciałbym użyć app.Uwolnij.plik konfiguracyjny zamiast aplikacji.config

Problem
To nie wydaje się być proste dla prostych .projekty typu dll. W przypadku projektów internetowych mogę wykonać konfigurację www. Znalazłem hack, Jak zrobić te przekształcenia dla projektu typu dll, ale nie jestem wielkim fanem hacków.

Pytanie
Co to jest standardowe podejście do aplikacji tweak.pliki konfiguracyjne w zależności od konfiguracji kompilacji dla projektów. NET (takich jak Debug, Release, ...)?

Author: oleksii, 2011-11-10

10 answers

Użyj wtyczkiSlowCheetah . Aby uzyskać więcej opcji i szczegółów, jak korzystać z SlowCheetah Czytaj dalej.

Jak już zauważyłeś, nie ma domyślnego i łatwego sposobu na użycie różnych plików konfiguracyjnych dla typu biblioteki (.dll) projekt. Powodem jest to, że obecne myślenie brzmi: "nie musisz"! Programiści frameworka uważają, że potrzebujesz konfiguracji dla pliku wykonywalnego: czy to konsoli, pulpitu, www, aplikacji mobilnej lub czegoś innego. Jeśli zaczniesz dostarczać konfigurację dla dll, możesz skończyć z czymś, co mogę nazwać Config hell . Możesz już nie rozumieć (łatwo), dlaczego zmienne te i inne mają tak dziwne wartości, które pojawiają się znikąd.

"trzymaj się", - możesz powiedzieć, " ale potrzebuję tego do mojej integracji / testów jednostkowych, i jest to biblioteka!". I to jest prawda i to jest to co możesz zrobić (wybierz tylko jeden, nie mieszaj):

1. SlowCheetah-przekształca bieżący plik konfiguracyjny

Możesz zainstalować SlowCheetah - Wtyczka Visual Studio, która wykonuje wszystkie niskopoziomowe szturchanie XML (lub transformację) za Ciebie. Sposób działania, krótko:

  • zainstaluj SlowCheetah i uruchom ponownie Visual Studio (Visual Studio > Narzędzia > Rozszerzenia i aktualizacje ... > Online > Galeria Visual Studio > Szukaj "Slow gepard" [30]}
  • Zdefiniuj konfiguracje rozwiązania ( Debug i Release są tam domyślnie), możesz dodać więcej (kliknij prawym przyciskiem myszy rozwiązanie w rozwiązanie Explorer > Menedżer Konfiguracji... > Konfiguracja Aktywnego Rozwiązania > Nowy...
  • Dodaj plik konfiguracyjny w razie potrzeby
  • kliknij prawym przyciskiem myszy na pliku konfiguracyjnym > Dodaj Transform
    • spowoduje to utworzenie plików transformacji - jeden na Twoją konfigurację
    • Transform files działa jako injectors / mutators, znajdują potrzebny kod XML w oryginalnym pliku konfiguracyjnym i wstrzykują nowe linie lub mutują potrzebną wartość, cokolwiek mu powiesz do

2. Pokręć się .proj file-copy-rename a whole new config file

Oryginalnie wzięte z tutaj . Jest to niestandardowe zadanie MSBuild, które można osadzić w Visual Studio .plik proj. Skopiuj i wklej poniższy kod do pliku projektu

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

Utwórz teraz folder w projekcie o nazwie Config i dodaj tam nowe pliki: App.Debugowanie.config, App.Uwolnij.config i tak dalej. Teraz, w zależności od konfiguracji, Visual Studio wybierze plik konfiguracyjny z folderu Config i skopiuje go i zmieni jego nazwę do katalogu wyjściowego. Więc jeśli masz wzorzec.Test.Integration project and a debug Config selected, in the output folder after the build you will find a PatternPA.Test.Integracja.dll.plik config , który został skopiowany z Config\App.Debug.config i przemianowany później.

Są to notatki, które możesz zostawić w plikach konfiguracyjnych

<?xml version="1.0" encoding="utf-8"?>
<configuration>

    <!-- This file is copied and renamed by the 'AfterBuild' MSBuild task -->

    <!-- Depending on the configuration the content of projectName.dll.config 
        is fully substituted by the correspondent to build configuration file 
        from the 'Config' directory. -->

</configuration>

W Visual Studio możesz mieć coś w rodzaju to

Struktura projektu

3. Używanie plików skryptów poza Visual Studio

Każde narzędzie do budowania (jak NAnt, MSBuild ) zapewni możliwość przekształcenia pliku konfiguracyjnego w zależności od konfiguracji. Jest to przydatne, jeśli budujesz rozwiązanie na maszynie budowlanej, gdzie musisz mieć większą kontrolę nad tym, co i jak przygotowujesz produkt do wydania.

Na przykład możesz użyć zadania Web publishing dll do przekształcenia dowolnego pliku konfiguracyjnego

<UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll"
    TaskName="TransformXml"/>

<PropertyGroup>
    <!-- Path to input config file -->  
    <TransformInputFile>path to app.config</TransformInputFile>
    <!-- Path to the transformation file -->    
    <TransformFile>path to app.$(Configuration).config</TransformFile>
    <!-- Path to outptu web config file --> 
    <TransformOutputFile>path to output project.dll.config</TransformOutputFile>
</PropertyGroup>

<Target Name="transform">
    <TransformXml Source="$(TransformInputFile)"
                  Transform="$(TransformFile)"
                  Destination="$(TransformOutputFile)" />
</Target>
 141
Author: oleksii,
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
2017-05-17 05:20:01

Możesz wypróbować następujące podejście:

  1. Kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz Unload Project .
  2. projekt zostanie rozładowany. Kliknij prawym przyciskiem myszy projekt ponownie i wybierz Edytuj .csproj.
  3. Teraz możesz edytować plik projektu w Visual Studio.
  4. Zlokalizuj miejsce w *.plik csproj, w którym znajduje się plik konfiguracyjny aplikacji. Będzie wyglądał tak:
    <ItemGroup>
        <None Include="App.config"/>
    </ItemGroup>
  1. Zastąp to wiersze o następującej treści:
    <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
        <None Include="App.Debug.config"/>
    </ItemGroup>

    <ItemGroup Condition=" '$(Configuration)' == 'Release' ">
        <None Include="App.Release.config"/>
    </ItemGroup>

Nie próbowałem tego podejścia do plików app.config, ale działało dobrze z innymi elementami projektów Visual Studio. Możesz dostosować proces budowania w prawie dowolny sposób. W każdym razie, daj mi znać wynik.

 23
Author: VHaravy,
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-11-10 16:41:33

Powinieneś rozważyć ConfigGen . Został opracowany w tym celu. Tworzy plik konfiguracyjny dla każdej maszyny wdrożeniowej, oparty na pliku szablonu i Pliku ustawień. Wiem, że to nie odpowiada konkretnie na twoje pytanie, ale może odpowiedzieć na twój problem.

Więc zamiast debugowania, Wydania itp., możesz mieć Test, UAT, Production itp. Możesz również mieć różne ustawienia dla każdej maszyny deweloperskiej, dzięki czemu możesz wygenerować konfigurację specyficzną dla twojego komputera deweloperskiego I zmienić go bez wpływu na inne rozmieszczenie.

Przykładem użycia może być...

<Target Name="BeforeBuild">
    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t       
        $(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" />

    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
        $(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" />
</Target>
Jeśli umieścisz to w swoim .plik csproj i masz następujące pliki...
$(ProjectDir)App.Config.Settings.xls

MachineName        ConfigFilePath   SQLServer        

default             App.config      DEVSQL005
Test                App.config      TESTSQL005
UAT                 App.config      UATSQL005
Production          App.config      PRODSQL005
YourLocalMachine    App.config      ./SQLEXPRESS


$(ProjectDir)App.config.template.xml 

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=[%SQLServer%]; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

... to będzie wynik...

Od pierwszego polecenia, Plik konfiguracyjny generowany dla każdego środowiska określonego w pliku xls, umieszczony w katalogu wyjściowym $(SolutionDir)ConfigGen

.../solutiondir/ConfigGen/Production/App.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=PRODSQL005; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

Z drugiego polecenia, aplikacji lokalnej.Config używany na Twoim dev maszyna zostanie zastąpiona wygenerowaną konfiguracją określoną przez przełącznik lokalny (- l) i przełącznik nazwy pliku (- n).

 11
Author: Daniel Dyson,
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-11-10 16:53:55

Używając tego samego podejścia co Romeo, dostosowałem go do Visual Studio 2010:

 <None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" />

 <None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" />

Tutaj musisz zachować obie aplikacje.pliki konfiguracyjne w różnych katalogach (appDebug i appRelease). Przetestowałem go i działa dobrze!

 9
Author: tem peru,
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
2018-05-03 10:33:52

Używam XmlPreprocess tool do manipulacji plikami konfiguracyjnymi. Używa jednego pliku mapowania dla wielu środowisk (lub wielu celów kompilacji w Twoim przypadku). Możesz edytować plik mapowania za pomocą programu Excel. Jest bardzo łatwy w użyciu.

 3
Author: Ludwo,
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-11-11 06:10:56

SlowCheetah i FastKoala z galerii VisualStudio wydają się być bardzo dobrymi narzędziami, które pomagają w rozwiązaniu tego problemu.

Jeśli jednak chcesz uniknąć dodawania lub używać zasad, które implementują szerzej w procesach budowania/integracji, dodanie tego do plików msbuild * proj jest skrótem.

Uwaga: Jest to mniej więcej przeróbka nr 2 odpowiedzi @ oleksii.

To działa .exe i .projekty dll:
  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
  </Target>

To działa dla projektów internetowych:

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
  </Target>

Zauważ, że ten krok dzieje się jeszcze przed rozpoczęciem właściwego budowania. Transformacja pliku konfiguracyjnego odbywa się w folderze projektu. Tak, że przekształcona sieć.config jest dostępny podczas debugowania (wadą SlowCheetah).

Pamiętaj, że jeśli utworzysz folder App_Config (lub cokolwiek wybierzesz, aby go nazwać), różne pośrednie pliki konfiguracyjne powinny mieć akcję budowania = None, A Skopiuj do katalogu wyjściowego = do not przyjąłem.

To łączy obie opcje w jeden blok. Odpowiedni jest wykonywany na podstawie warunków. Zadanie TransformXml jest zdefiniowane jako pierwsze:

<Project>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Condition="Exists('App_Config\app.Base.config')" Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
    <TransformXml Condition="Exists('App_Config\Web.Base.config')" Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
</Target>

 3
Author: Eniola,
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
2018-05-11 08:06:44

Zobacz czy XDT (web.config) transform engine może Ci pomóc. Obecnie jest on obsługiwany tylko natywnie dla projektów internetowych, ale technicznie nic nie stoi na przeszkodzie, aby używać go w innych typach aplikacji. Istnieje wiele poradników jak używać XDT ręcznie edytując pliki projektu, ale znalazłem wtyczkę, która działa świetnie: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

Plugin tylko pomaga w konfiguracji, nie jest potrzebne do budowy i rozwiązanie może być zbudowany na innych maszynach lub na serwerze budowania bez wtyczki lub innych narzędzi są wymagane.

 1
Author: TGasdf,
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
2016-02-10 12:13:26

Rozwiązałem ten temat za pomocą rozwiązania, które znalazłem tutaj: http://www.blackwasp.co.uk/SwitchConfig.aspx

W skrócie to, co mówią tam jest: "poprzez dodanie zdarzenia post-build.[...] Musimy dodać:

if "Debug"=="$(ConfigurationName)" goto :nocopy
del "$(TargetPath).config"
copy "$(ProjectDir)\Release.config" "$(TargetPath).config"
:nocopy
 0
Author: Janbro,
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
2017-08-23 13:12:23

Po kilku badaniach nad zarządzaniem konfiguracjami dla developerów i buildów itp, postanowiłem uruchomić własny, udostępniłem go na bitbucket pod adresem: https://bitbucket.org/brightertools/contemplate/wiki/Home

To wiele plików konfiguracyjnych dla wielu środowisk, to podstawowe narzędzie do wymiany wpisów konfiguracyjnych, które będzie działać z dowolnym formatem plików tekstowych.

Mam nadzieję, że to pomoże.

 0
Author: Mark Redman,
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
2017-11-23 07:25:48

Słyszałem dobre rzeczy o SlowCheetah, ale nie mogłem go uruchomić. Wykonałem następujące czynności: Dodaj tag am do każdego dla określonej konfiguracji.

Ex:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'UAT|AnyCPU'">
    <OutputPath>bin\UAT\</OutputPath>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AppConfig>App.UAT.config</AppConfig>
  </PropertyGroup>
 0
Author: Mike,
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
2018-08-02 19:33:18