web-dev-qa-db-de.com

Hinzufügen von Konfigurationsumwandlungen für eine benutzerdefinierte Konfigurationsdatei in Visual Studio

Das Projekt, an dem ich arbeite, beinhaltet das Lesen einer Vielzahl von Service-Endpunkten (URL) aus einer Konfigurationsdatei. Da die Liste ziemlich groß wäre, habe ich mich entschlossen, sie in einer benutzerdefinierten Konfigurationsdatei zu speichern, um meine web.config sauber und klein zu halten. Ich habe den benutzerdefinierten Abschnitt wie folgt in mein Web aufgenommen:

<mySection configSource="myConfig.config" />

Ich arbeite einwandfrei.

Das Problem der Transformation tritt jedoch bei der Bereitstellung des Projekts in verschiedenen Umgebungen auf. Ich habe drei web.config-Dateien:

Web.config

Web.Uat.config

Web.Release.config

Während die Umwandlung web.config funktioniert, schlagen die Umwandlungen für benutzerdefinierte Konfigurationsdateien bei der Bereitstellung fehl. 

Gibt es eine Möglichkeit, die benutzerdefinierte Konfigurationsdatei während der Bereitstellung umzuwandeln?

18
TejSoft

Visual Studio konvertiert standardmäßig nur web.config-Dateien. 

Wenn Sie eine benutzerdefinierte Konfigurationsdatei mit Transformation für Umgebungen mit DEV, UAT, PROD usw. benötigen, versuchen Sie es mit 

  1. Verwenden Sie benutzerdefinierte Erweiterungen für Visual Studio, z. B. SlowCheetah - XML ​​Transforms für die Umwandlungsvorschau von Config. 
  2. Fügen Sie für das Projekt aus Nuget SlowCheetah hinzu, um die Umwandlung zu ermöglichen.

Ein bisschen Details: 

Hinzufügen der VS-Erweiterungs-SlowCheetah aus Erweiterungen und Updates  Screen of Extensions and Updates

Klicken Sie mit der rechten Maustaste auf Ihre myconfig.config und wählen Sie "Transorm hinzufügen" aus:  Screen of Extensions and Updates

Fügen Sie in jede definierte Konfiguration Ihre eigenen Transormationsrullen wie folgt ein:

<services xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
  <service name="WebApplication1.Services.Service2" xdt:Transform="Replace" xdt:Locator="Match(name)" >
    <endpoint address="http://localhost:57939/Services/DebugService" behaviorConfiguration="WebApplication1.Services.Service2AspNetAjaxBehavior"
      binding="webHttpBinding" contract="WebApplication1.Services.Service2" />
  </service>
</services>

Ich hoffe es war hilfreich

18
Michael

Ich werde auf Andoni Ripoll Jarautas Antwort ein wenig eingehen.

Wir hatten ein ähnliches Problem. Ich wollte die Verbindungszeichenfolgen aus der Datei web.config ziehen, um Zusammenführungskonflikte zu begrenzen. Ich wollte auch eine "Release" -Konfiguration erstellen, die bei der Veröffentlichung statische Informationen enthält.

...einfach genug. Erstellen Sie eine benutzerdefinierte Konfigurationsdatei, webdb.config, und aktualisieren Sie die Datei web.config.

Ex . Web.config

<connectionStrings configSource="WebDB.config"/>

wedbdb.config (xml version = "1.0" ist für die Transformation erforderlich)

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

Als nächstes fügen Sie Transformationsdateien für webdb.config hinzu

 enter image description here

Beispiel für WebDB.Debug.config:

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

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=localhost;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

Beispiel für WebDB.Release.config:

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

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=prod_server;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=prod_server;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

Als Nächstes müssen wir ein After-Build-Ereignis hinzufügen. Dies wird durch einfaches Bearbeiten der CSPROJ-Datei erstellt.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
    <TransformXml Source="WebDB.config" Transform="WebDB.$(Configuration).config" Destination="WebDB.config" />
</Target>

Wenn ich jetzt lokal arbeite, erhalte ich WebDB.Debug.config und wenn ich meinen Code veröffentliche, muss ich nur "Release" als Konfigurationsquelle auswählen. In beiden Fällen wird die Datei WebDB.config beim Erstellen mit der entsprechenden Datei aktualisiert.

HINWEIS: Stellen Sie sicher, dass Sie webdb.config, webdb.debug.config und webdb.release.config für die Option "In Ausgabeverzeichnis kopieren" auf "Nicht kopieren" setzen.

Hoffe das hilft!

4
spyder1329

Ich habe SlowCheetah verwendet, aber ich habe etwas gefunden, das ich für eleganter halte. Sie müssen dem Build nur mitteilen, dass er die .config abhängig von der Build-Konfiguration generiert. 

Wenn Sie eine app.Release.config in Ihrem Projekt haben (oder viele weitere, je nach Bereitstellungsanforderungen), müssen Sie nur die Projektdatei bearbeiten (die .csproj-Datei, wenn Sie in C # programmieren). Suchen Sie das Ende davon zwischen dem letzten </ItemGroup> und </Project> und fügen Sie Folgendes hinzu:

  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterBuild">
    <PropertyGroup>
      <OutputTypeName>$(OutputType)</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Library'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Module'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Winexe'">exe</OutputTypeName>
    </PropertyGroup>
    <TransformXml Source="Config\app.config" Transform="Config\app.$(Configuration).config" Destination="$(OutputPath)\$(AssemblyName).$(OutputTypeName).config" />
  </Target>
</Project>

Speichern und neu laden von VisualStudio. Kompilieren Sie im Freigabemodus und überprüfen Sie den bin/Release-Ordner in Ihrer <MyProject>.config-Datei, in der die Umwandlung abgeschlossen ist.

Dieses Beispiel gilt für Exe- und DLL-Dateien und alle VisualStudio-Versionen, da diese Beitragshilfe enthält.

Es gibt einen anderen Ansatz, bei dem keine Erweiterungen installiert werden müssen noch Build-Ereignisse verwendet werden.

Nehmen wir an, Sie haben Ihre benutzerdefinierten Konfigurationen so:

  • myConfig.config
  • myConfig.Uat.config
  • myConfig.Release.config

Dann haben Sie in Ihrem Web.config folgendes:

<mySection configSource="myConfig.config" />

Zuletzt fügen Sie in Ihrem Web.Uat.config eine Transformation wie folgt hinzu:

<mySection configSource="myConfig.Uat.config" xdt:Transform="SetAttributes" />

Dies ist keine Umwandlung der myConfig.config-Datei, sondern der Name der benutzerdefinierten Konfigurationsdatei, die verwendet werden soll. Sie können dasselbe für die Release und jede andere Umgebung tun.

Ihr myConfig.Uat.config sollte keine Transformationen enthalten. Es sollte eine Kopie der Basiskonfigurationsdatei mit den entsprechenden Werten für die benutzerdefinierte Umgebung sein.

Der Nachteil ist jedes Mal, wenn Sie etwas zur Basis-Konfigurationsdatei hinzufügen. Sie müssen auch die Konfigurationsdateien für andere Umgebungen hinzufügen (selbst wenn der Wert durch die Eingabe von "envs" gleich sein sollte). Ich würde mir überlegen, diese benutzerdefinierten Konfigurationsdateien für Einstellungen zu verwenden, die zwischen den Umgebungen geändert werden sollten.

0
Alisson