W przypadku aplikacji sieci Web Visual Studio 2010 mamy funkcje Transformacji konfiguracji, dzięki którym możemy utrzymywać wiele plików konfiguracyjnych dla różnych środowisk. Ale ta sama funkcja nie jest dostępna dla plików App.Config dla usług Windows / WinForms lub aplikacji konsolowej.
Dostępne jest obejście, jak sugerowano tutaj: Zastosowanie magii XDT do App.Config .
Nie jest to jednak proste i wymaga szeregu kroków. Czy istnieje łatwiejszy sposób na osiągnięcie tego samego w przypadku plików app.config?
Odpowiedzi:
Działa to teraz z dodatkiem Visual Studio AddIn opisanym w tym artykule: SlowCheetah - Web.config Składnia transformacji uogólniona dla dowolnego pliku konfiguracyjnego XML .
źródło
Wypróbowałem kilka rozwiązań i oto najprostsze, jakie osobiście znalazłem.
Dan zauważył w komentarzach, że oryginalny post należy do Olega Sycha - dzięki, Oleg!
Oto instrukcje:
1. Dodaj plik XML dla każdej konfiguracji do projektu.
Zazwyczaj będziesz mieć
Debug
iRelease
konfiguracje, więc nazwij swoje plikiApp.Debug.config
iApp.Release.config
. W moim projekcie stworzyłem konfigurację dla każdego rodzaju środowiska, więc możesz z tym eksperymentować.2. Zwolnij projekt i otwórz plik .csproj do edycji
Visual Studio umożliwia edytowanie plików .csproj bezpośrednio w edytorze - wystarczy najpierw rozładować projekt. Następnie kliknij go prawym przyciskiem myszy i wybierz opcję Edycja <Nazwa projektu> .csproj .
3. Powiąż pliki aplikacji. *. Config z głównym plikiem App.config
Znajdź sekcję pliku projektu, która zawiera wszystkie
App.config
iApp.*.config
odniesienia. Zauważysz, że ich działania kompilacji są ustawione naNone
:Najpierw ustaw akcję budowania dla wszystkich
Content
.Następnie uzależnij wszystkie pliki specyficzne od konfiguracji od głównego,
App.config
aby program Visual Studio grupował je tak, jak robi to pliki projektanta i kodu.Zamień XML powyżej na poniższy:
4. Aktywuj magię transformacji (konieczne tylko dla wersji Visual Studio wcześniejszych niż VS2017 )
Na końcu pliku po
i przed finałem
wstaw następujący kod XML:
Teraz możesz ponownie załadować projekt, zbudować go i cieszyć się
App.config
transformacjami!Do Twojej wiadomości
Upewnij się, że twoje
App.*.config
pliki mają odpowiednią konfigurację:źródło
v10.0
zv$(VisualStudioVersion)
aby upewnić się, że projekt działa ze wszystkimi późniejszymi wersjami VS.Innym rozwiązaniem, które znalazłem, jest NIE używanie transformacji, ale tylko oddzielny plik konfiguracyjny, np. App.Release.config. Następnie dodaj tę linię do pliku csproj.
Spowoduje to nie tylko wygenerowanie właściwego pliku myprogram.exe.config, ale jeśli do generowania MSI używasz Instalatora i projektu wdrażania w programie Visual Studio, wymusi on, aby projekt wdrożenia używał poprawnego pliku konfiguracji podczas pakowania.
źródło
<AppConfig>App.Release.config</AppConfig>
linię wewnątrz istniejącego<PropertyGroup
warunku dlaRelease
konfiguracji, a IDE pokazało krętą linię pod linią<AppConfig>
..., mówiąc, że nie ma jej w schemacie czy coś, ale mimo to zapisałem plik i ponownie załadowałem plik projektu i zrobiłem kompilację wRelease
konfiguracji i zadziałało!Z mojego doświadczenia wynika, że muszę dostosować do środowiska takie jak parametry połączenia, ustawienia i często ustawienia smpt. System konfiguracji pozwala określić te rzeczy w osobnych plikach. Możesz więc użyć tego w app.config / web.config:
Zazwyczaj umieszczam te sekcje dotyczące konfiguracji w osobnych plikach, w podfolderze o nazwie ConfigFiles (w zależności od katalogu głównego rozwiązania lub na poziomie projektu). Plik definiuję według konfiguracji, np. Smtp.config.Debug i smtp.config.Release.
Następnie możesz zdefiniować zdarzenie przed kompilacją:
W rozwoju zespołu możesz to jeszcze bardziej ulepszyć, włączając do konwencji% COMPUTERNAME% i / lub% USERNAME%.
Oczywiście oznacza to, że pliki docelowe (x.config) NIE powinny być poddawane kontroli źródła (ponieważ są generowane). Nadal powinieneś dodać je do pliku projektu i ustawić właściwość typu wyniku na „kopiuj zawsze” lub „kopiuj, jeśli nowszy”.
Prosty, rozszerzalny i działa dla wszystkich typów projektów Visual Studio (konsola, winforms, wpf, web).
źródło
<?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp>
Transformacja:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="[email protected]" deliveryMethod="Network"> <network .../> </smtp>
Zainspirowany przez Olega i innych w tym pytaniu, podjąłem rozwiązanie https://stackoverflow.com/a/5109530/2286801 o krok dalej, aby umożliwić następujące.
To rozwiązanie działa, wykonując transformację app.config przed odwołaniem do app.config po raz pierwszy w procesie MSBuild. Wykorzystuje zewnętrzny plik celów do łatwiejszego zarządzania wieloma projektami.
Instrukcje:
Podobne kroki do drugiego rozwiązania. Przytoczyłem to, co pozostaje niezmienne, i załączyłem to dla kompletności i łatwiejszego porównania.
0. Dodaj nowy plik do projektu o nazwie AppConfigTransformation.targets
3. Powiąż pliki aplikacji. *. Config z głównym plikiem App.config
Znajdź sekcję pliku projektu zawierającą wszystkie odwołania do App.config i App. *. Config i zamień w następujący sposób. Zauważysz, że używamy None zamiast Treści.
wstaw następujący kod XML:
Gotowy!
źródło
Możesz użyć oddzielnego pliku konfiguracyjnego dla każdej konfiguracji, np. App.Debug.config, app.Release.config, a następnie użyć zmiennej konfiguracyjnej w pliku projektu:
Spowoduje to utworzenie poprawnego pliku ProjectName.exe.config w zależności od konfiguracji, w której budujesz.
źródło
Napisałem ładne rozszerzenie do automatyzacji transformacji app.config, takie jak wbudowane w Web Application Project Configuration Transform
Największą zaletą tego rozszerzenia jest to, że nie trzeba go instalować na wszystkich komputerach
źródło
Zainstaluj „Narzędzie do transformacji konfiguracji” w Visual Studio z Marketplace i zrestartuj VS. Zobaczysz także transformację podglądu menu dla app.config.
https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform
źródło
Skończyłem więc z nieco innym podejściem. Postępowałem zgodnie z krokami Dana przez krok 3, ale dodałem inny plik: App.Base.Config. Ten plik zawiera ustawienia konfiguracji, które chcesz w każdej wygenerowanej aplikacji. Konfiguracji. Następnie używam BeforeBuild (z dodatkiem Yuri do TransformXml), aby przekształcić bieżącą konfigurację z konfiguracją Base w App.config. Proces kompilacji używa następnie przekształconego pliku App.config w normalny sposób. Jednak jedną z irytacji jest to, że chcesz w jakiś sposób wykluczyć ciągle zmieniający się plik App.config z kontroli źródła, ale inne pliki konfiguracyjne są teraz od niego zależne.
źródło
Tylko mała poprawka do rozwiązania, które wydaje się być teraz wszędzie wszędzie:
źródło
$(VisualStudioVersion)
to, że jest ustawione, gdy używasz MSBuild bezpośrednio.Stworzyłem inną alternatywę dla tej opublikowanej przez Vishala Joshi, w której usunięto wymóg zmiany działania kompilacji na Treść, a także zaimplementowałem podstawową obsługę wdrażania ClickOnce. Mówię podstawowy, ponieważ nie przetestowałem go dokładnie, ale powinien działać w typowym scenariuszu wdrażania ClickOnce.
Rozwiązanie składa się z pojedynczego projektu MSBuild, który po zaimportowaniu do istniejącego projektu aplikacji systemu Windows (* .csproj) rozszerza proces kompilacji o transformację app.config.
Bardziej szczegółowe objaśnienie można przeczytać na stronie Visual Studio App.config XML Transformation i plik projektu MSBuild może być pobrać z GitHub .
źródło
Jeśli korzystasz z TFS online (wersja w chmurze) i chcesz przekształcić App.Config w projekcie, możesz wykonać następujące czynności bez instalowania dodatkowych narzędzi. Od VS => Zwolnij projekt => Edytuj plik projektu => Idź na dół pliku i dodaj:
AssemblyFile and Destination działa na użytek lokalny i serwer TFS online (Cloud).
źródło
proponowane rozwiązanie nie będzie działać, gdy do biblioteki klas z plikiem konfiguracyjnym zostanie odwołany inny projekt (w moim przypadku była to biblioteka projektów roboczych Azure). Nie skopiuje poprawnego transformowanego pliku z
obj
folderu dobin\##configuration-name##
folderu. Aby działało z minimalnymi zmianami, musisz zmienićAfterCompile
cel naBeforeCompile
:źródło