Für die webbasierte Anwendung von Visual Studio 2010 verfügen wir über Konfigurationsumwandlungsfunktionen, mit denen wir mehrere Konfigurationsdateien für verschiedene Umgebungen verwalten können. Die gleiche Funktion ist jedoch nicht für App.Config-Dateien für Windows Services / WinForms oder Console Application verfügbar.
Wie hier vorgeschlagen, steht eine Problemumgehung zur Verfügung: Anwenden von XDT-Magie auf App.Config .
Es ist jedoch nicht einfach und erfordert eine Reihe von Schritten. Gibt es eine einfachere Möglichkeit, dasselbe für app.config-Dateien zu erreichen?
Antworten:
Dies funktioniert jetzt mit dem in diesem Artikel behandelten Visual Studio AddIn: SlowCheetah - Web.config-Transformationssyntax, die jetzt für jede XML-Konfigurationsdatei verallgemeinert wird .
quelle
Ich habe verschiedene Lösungen ausprobiert und hier ist die einfachste, die ich persönlich gefunden habe.
Dan wies in den Kommentaren darauf hin , dass der Original - Beitrag gehört zu Oleg Sych - danke, Oleg!
Hier sind die Anweisungen:
1. Fügen Sie dem Projekt für jede Konfiguration eine XML-Datei hinzu.
In der Regel haben Sie
Debug
undRelease
Konfigurationen, benennen Sie also Ihre DateienApp.Debug.config
undApp.Release.config
. In meinem Projekt habe ich eine Konfiguration für jede Art von Umgebung erstellt. Vielleicht möchten Sie damit experimentieren.2. Entladen Sie das Projekt und öffnen Sie die .csproj-Datei zur Bearbeitung
Mit Visual Studio können Sie .csproj- Dateien direkt im Editor bearbeiten. Sie müssen lediglich das Projekt zuerst entladen. Klicken Sie dann mit der rechten Maustaste darauf und wählen Sie <Projektname> .csproj bearbeiten .
3. Binden Sie App. *. Config-Dateien an die Haupt-App.config
Suchen Sie den Projektdateibereich, der alle
App.config
undApp.*.config
Referenzen enthält . Sie werden feststellen, dass ihre Build-Aktionen auf Folgendes eingestellt sindNone
:Stellen Sie zunächst die Build-Aktion für alle ein
Content
.Machen Sie als Nächstes alle konfigurationsspezifischen Dateien von der Hauptdatei abhängig,
App.config
damit Visual Studio sie wie Designer- und CodeBehind-Dateien gruppiert.Ersetzen Sie XML oben durch das folgende:
4. Aktivieren Sie Transformations Magic (nur für Visual Studio-Versionen vor VS2017 erforderlich ).
Am Ende der Datei nach
und vor dem Finale
Fügen Sie das folgende XML ein:
Jetzt können Sie das Projekt neu laden, erstellen und
App.config
Transformationen genießen !Zu Ihrer Information
Stellen Sie sicher, dass Ihre
App.*.config
Dateien das richtige Setup haben:quelle
v10.0
mitv$(VisualStudioVersion)
sicherstellen , dass Ihr Projekt funktioniert mit allen neueren Versionen von VS.Eine andere Lösung, die ich gefunden habe, besteht darin, die Transformationen NICHT zu verwenden, sondern nur eine separate Konfigurationsdatei zu haben, z. B. app.Release.config. Fügen Sie diese Zeile dann Ihrer csproj-Datei hinzu.
Dadurch wird nicht nur die richtige Datei myprogram.exe.config generiert. Wenn Sie zum Erstellen von MSI das Setup- und Bereitstellungsprojekt in Visual Studio verwenden, wird das Bereitstellungsprojekt gezwungen, beim Packen die richtige Konfigurationsdatei zu verwenden.
quelle
<AppConfig>App.Release.config</AppConfig>
Zeile in die vorhandene<PropertyGroup
Bedingung für dieRelease
Konfiguration eingefügt und die IDE zeigte eine verschnörkelte Zeile unter der<AppConfig>
Zeile ... an, die besagt, dass sie nicht im Schema oder so enthalten ist, aber ich habe die Datei trotzdem gespeichert und die Projektdatei neu geladen und einen Build erstellt inRelease
config und es hat funktioniert!Nach meiner Erfahrung sind die Dinge, die ich umgebungsspezifisch machen muss, Dinge wie Verbindungszeichenfolgen, Appsettings und oft smpt-Einstellungen. Das Konfigurationssystem ermöglicht es, diese Dinge in separaten Dateien anzugeben. Sie können dies also in Ihrer app.config / web.config verwenden:
Normalerweise füge ich diese konfigurationsspezifischen Abschnitte in separaten Dateien in einem Unterordner namens ConfigFiles ab (abhängig vom Lösungsstamm oder auf Projektebene). Ich definiere eine Datei pro Konfiguration, z. B. smtp.config.Debug und smtp.config.Release.
Dann können Sie ein Pre-Build-Ereignis wie folgt definieren:
In der Teamentwicklung können Sie dies weiter optimieren, indem Sie% COMPUTERNAME% und / oder% USERNAME% in die Konvention aufnehmen.
Dies bedeutet natürlich, dass die Zieldateien (x.config) NICHT in die Quellcodeverwaltung gestellt werden sollten (da sie generiert werden). Sie sollten sie dennoch zur Projektdatei hinzufügen und ihre Eigenschaft für den Ausgabetyp auf "Immer kopieren" oder "Kopieren, wenn neuer" setzen.
Einfach, erweiterbar und funktioniert für alle Arten von Visual Studio-Projekten (Konsole, Winforms, Wpf, Web).
quelle
<?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp>
Die Transformation:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="[email protected]" deliveryMethod="Network"> <network .../> </smtp>
Inspiriert von Oleg und anderen in dieser Frage ging ich mit der Lösung https://stackoverflow.com/a/5109530/2286801 einen Schritt weiter, um Folgendes zu ermöglichen.
Diese Lösung führt die Umwandlung von app.config durch, bevor im MSBuild-Prozess zum ersten Mal auf app.config verwiesen wird. Es verwendet eine externe Zieldatei für eine einfachere Verwaltung über mehrere Projekte hinweg.
Anleitung:
Ähnliche Schritte zur anderen Lösung. Ich habe zitiert, was gleich bleibt, und es der Vollständigkeit halber und zum leichteren Vergleich aufgenommen.
0. Fügen Sie Ihrem Projekt eine neue Datei mit dem Namen AppConfigTransformation.targets hinzu
3. Binden Sie App. *. Config-Dateien an die Haupt-App.config
Suchen Sie den Abschnitt mit der Projektdatei, der alle Verweise auf App.config und App. *. Config enthält, und ersetzen Sie ihn wie folgt. Sie werden feststellen, dass wir "Keine" anstelle von "Inhalt" verwenden.
Fügen Sie das folgende XML ein:
Erledigt!
quelle
Sie können pro Konfiguration eine separate Konfigurationsdatei verwenden, z. B. app.Debug.config, app.Release.config, und dann die Konfigurationsvariable in Ihrer Projektdatei verwenden:
Dadurch wird abhängig von der Konfiguration, in die Sie einbauen, die richtige Datei ProjectName.exe.config erstellt.
quelle
Ich habe eine nette Erweiterung geschrieben, um die Umwandlung von app.config zu automatisieren, wie die in Web Application Project Configuration Transform integrierte
Der größte Vorteil dieser Erweiterung ist, dass Sie sie nicht auf allen Build-Maschinen installieren müssen
quelle
Installieren Sie "Configuration Transform Tool" in Visual Studio von Marketplace und starten Sie VS neu. Sie können die Menüvorschau-Transformation auch für app.config sehen.
https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform
quelle
Also habe ich einen etwas anderen Ansatz gewählt. Ich folgte Dans Schritten durch Schritt 3, fügte aber eine weitere Datei hinzu: App.Base.Config. Diese Datei enthält die gewünschten Konfigurationseinstellungen in jeder generierten App.Config. Dann verwende ich BeforeBuild (mit Yuris Zusatz zu TransformXml), um die aktuelle Konfiguration mit der Basiskonfiguration in die App.config umzuwandeln. Der Erstellungsprozess verwendet dann wie gewohnt die transformierte App.config. Ein Ärger ist jedoch, dass Sie die sich ständig ändernde App.config später von der Quellcodeverwaltung ausschließen möchten, aber die anderen Konfigurationsdateien sind jetzt davon abhängig.
quelle
Nur eine kleine Verbesserung der Lösung, die derzeit überall veröffentlicht zu werden scheint:
quelle
$(VisualStudioVersion)
es eingestellt, wenn MSBuild direkt verwendet wird.Ich habe eine andere Alternative zu der von Vishal Joshi veröffentlichten erstellt, bei der die Anforderung zum Ändern der Build-Aktion in " Inhalt" entfernt und die grundlegende Unterstützung für die ClickOnce-Bereitstellung implementiert wurde. Ich sage einfach, weil ich es nicht gründlich getestet habe, aber es sollte im typischen ClickOnce-Bereitstellungsszenario funktionieren.
Die Lösung besteht aus einem einzelnen MSBuild-Projekt, das nach dem Import in ein vorhandenes Windows-Anwendungsprojekt (* .csproj) den Erstellungsprozess erweitert, um die Umwandlung von app.config in Betracht zu ziehen.
Eine ausführlichere Erklärung finden Sie unter Visual Studio App.config XML Transformation. Die MSBuild-Projektdatei kann von GitHub heruntergeladen werden .
quelle
Wenn Sie ein TFS online (Cloud-Version) verwenden und die App.Config in ein Projekt umwandeln möchten, können Sie Folgendes tun, ohne zusätzliche Tools zu installieren. Von VS => Projekt entladen => Projektdatei bearbeiten => Gehen Sie zum Ende der Datei und fügen Sie Folgendes hinzu:
AssemblyFile and Destination funktioniert für die lokale Verwendung und den TFS-Online-Server (Cloud).
quelle
Die vorgeschlagene Lösung funktioniert nicht, wenn auf eine Klassenbibliothek mit Konfigurationsdatei aus einem anderen Projekt verwiesen wird (in meinem Fall war es die Azure Worker-Projektbibliothek). Die korrekt transformierte Datei wird nicht von
obj
Ordner zubin\##configuration-name##
Ordner kopiert . Damit es mit minimalen Änderungen funktioniert, müssen Sie dasAfterCompile
Ziel ändern inBeforeCompile
:quelle