589 Stimmen

App.Config Transformation für Projekte, die keine Webprojekte in Visual Studio sind?

Für Visual Studio 2010 Web-basierte Anwendung haben wir Config Transformation Funktionen, durch die wir mehrere Konfigurationsdateien für verschiedene Umgebungen pflegen können. Die gleiche Funktion ist jedoch nicht für App.Config-Dateien für Windows Services/WinForms oder Konsolenanwendungen verfügbar.

Es gibt eine Umgehungslösung, die hier vorgeschlagen wird: Anwendung der XDT-Magie auf App.Config .

Dies ist jedoch nicht ganz einfach und erfordert eine Reihe von Schritten. Gibt es eine einfachere Möglichkeit, dasselbe für app.config-Dateien zu erreichen?

0 Stimmen

Ich bin auf den folgenden Artikel gestoßen, der etwas einfacher zu sein scheint, aber ich habe es nicht selbst ausprobiert. fknut.blogspot.com/2009/11/ Außerdem gibt es eine Funktionsanfrage auf MS Connect, für die es sich lohnen könnte, abzustimmen, damit sie in der nächsten SP oder Version durchgängig berücksichtigt wird. connect.microsoft.com/VisualStudio/rückmeldung/details/564414

2voto

João Angelo Punkte 54226

Ich habe eine weitere Alternative zu der von Vishal Joshi geposteten erstellt, bei der die Anforderung, die Build-Aktion in Inhalt entfernt und auch grundlegende Unterstützung für die ClickOnce-Bereitstellung implementiert. Ich sage grundlegend, weil ich es nicht gründlich getestet habe, aber es sollte im typischen ClickOnce-Bereitstellungsszenario funktionieren.

Die Lösung besteht aus einem einzigen MSBuild-Projekt, das, sobald es in ein bestehendes Windows-Anwendungsprojekt (*.csproj) importiert wurde, den Build-Prozess erweitert, um die app.config-Transformation zu berücksichtigen.

Eine ausführlichere Erklärung finden Sie unter Visual Studio App.config XML-Transformation und die MSBuild-Projektdatei können heruntergeladen von GitHub .

2voto

Benjamin Punkte 323

Wenn Sie einen TFS online (Cloud-Version) verwenden und die App.Config in einem Projekt umwandeln möchten, können Sie Folgendes tun, ohne zusätzliche Tools zu installieren. Von VS => Projekt entladen => Projektdatei bearbeiten => zum Ende der Datei gehen und folgendes hinzufügen:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

AssemblyFile und Destination funktionieren für die lokale Nutzung und den TFS Online(Cloud)-Server.

1voto

avs099 Punkte 10329

Die vorgeschlagene Lösung funktioniert nicht, wenn eine Klassenbibliothek mit einer Konfigurationsdatei von einem anderen Projekt referenziert wird (in meinem Fall war es die Azure Worker-Projektbibliothek). Es wird nicht die korrekte transformierte Datei von obj Ordner in bin\##configuration-name## Ordner. Damit es mit minimalen Änderungen funktioniert, müssen Sie Folgendes ändern AfterCompile Ziel zu BeforeCompile :

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">

1voto

Sparky Punkte 51

Hinweis: Aus Gründen der Reputation kann ich mich nicht zu bdeem 's Beitrag . Ich poste stattdessen meine Ergebnisse als Antwort.

Unter bdeem 's Beitrag habe ich Folgendes getan (in dieser Reihenfolge):

1. Ich habe die [project].csproj Akte. Hinzufügen der <Content Include="" /> Tags zum ItemGroup für die verschiedenen config Dateien und machte sie abhängig von der ursprünglichen config Datei.

Anmerkung: Mit <None Include="" /> funktioniert nicht mit der Transformation.

<!-- App.config Settings -->
<!-- Create App.($Configuration).config files here. -->
<Content Include="App.config" />
<Content Include="App.Debug.config">
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config">
  <DependentUpon>App.config</DependentUpon>
</Content>

2. Am unteren Ende der [project].csproj Datei (vor der abschließenden </Project> Tag), importierte ich die ${MSBuildToolsPath\Microsoft.CSharp.targets Datei, fügte die UsingTask um das XML zu transformieren und fügte die Target zum Kopieren der transformierten App.config Datei an den Ausgabespeicherort.

Anmerkung: Die Target überschreibt auch die App.Config im lokalen Verzeichnis, um sofort zu sehen, wie die Änderungen lokal funktionieren. Die Website Target verwendet auch die Name="Afterbuild" Eigenschaft, um sicherzustellen, dass die Konfigurationsdateien transformiert werden können nach werden die ausführbaren Dateien erzeugt. Aus Gründen, die ich nicht verstehe, wenn ich WCF-Endpunkte verwende, wenn ich Name="CoreCompile" erhalte ich Warnungen zu den Dienstattributen. Name="Afterbuild" Dies wurde gelöst.

  <!-- Task to transform the App.config using the App.($Configuration).config file. -->
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />

  <!-- Only compile the App.config if the App.($Configuration).config file exists. -->
  <!-- Make sure to use the AfterBuild name instead of CoreCompile to avoid first time build errors and WCF endpoint errors. -->
  <Target Name="AfterBuild" Condition="exists('App.$(Configuration).config')">
    <!-- Generate transformed App.config in the intermediate output directory -->    
    <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />

    <!-- Modify the original App.config file with the transformed version. -->
    <TransformXml Source="App.config" Destination="App.config" Transform="App.$(Configuration).config" />

    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="App.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>
</Project>

3. Gehen Sie zurück zu Visual Studio und laden Sie die geänderten Dateien erneut.

*4. Manuelles Hinzufügen der `App..configDateien zum Projekt. Dadurch konnten sie unter dem ursprünglichenApp.config` Datei.**

Hinweis: Stellen Sie sicher, dass die App.*.config Dateien die richtige XML-Struktur haben.

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

<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="myConn" connectionString=""; Initial Catalog=; User ID=; Password=;" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
  </connectionStrings>
</configuration>

5. Das Projekt wird neu aufgebaut.

1voto

Daniel Punkte 1483

Eine weitere Variante der Antwort von @bdeem mit Visual Studio 2019 und 2022. Mein Problem war, dass mit dieser Lösung, App.config überschrieben wurde, und da es sich in der Versionskontrolle befindet, ist das nicht wirklich eine Option.

Die Lösung für mich war, die Konfigurationsdatei direkt in das Ausgabeverzeichnis zu transformieren.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
    <!-- Generate transformed app config to the output directory -->
    <TransformXml Source="App.config" Destination="$(OutDir)\$(TargetFileName).config" Transform="App.$(Configuration).config" />
  </Target>

Sie hat den zusätzlichen Vorteil, dass sie um einiges kürzer ist als die ursprüngliche Lösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X