In einer .NET MVC 3.0-Anwendung habe ich die folgende Konfiguration in appSettings
:
web.config
<appSettings>
<add key="SMTPHost" value="mail.domain.com"/>
<add key="SMTPUsername" value="[email protected]"/>
<add key="SMTPPort" value="25"/>
<add key="SMTPPwd" value="mypassword"/>
<add key="EmailFrom" value="[email protected]"/>
</appSettings>
Für das Debuggen habe ich folgende Konfigurationstransformation definiert:
web.Debug.config
<appSettings>
<add key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>
Und ich führe die Anwendung im Debug-Modus aus, aber mein SMTP-Port übernimmt immer noch den Wert von web.config
, nicht web.Debug.config
.
Kann jemand vorschlagen, was in dieser Konfiguration falsch sein könnte?
Visual Studio (2010 - 2019) unterstützt es leider nicht direkt während des Debuggens, es ist nur zum Veröffentlichen gedacht - selbst mit der Erweiterung SlowCheetah (markierte Antwort) funktioniert es nicht für mich (nur für Projekte, die app.config verwenden und nicht web.config).
Beachten Sie, dass es eine Abhilfe bei Codeproject beschrieben .
Es wird beschrieben, wie Sie die .msproj-Datei so ändern, dass die aktuelle web.config durch die transformierte Version überschrieben wird.
Ich werde diese Problemumgehung zunächst als Option 1 beschreiben , habe jedoch kürzlich eine andere Option 2 herausgefunden , die einfacher zu verwenden ist (Sie können also direkt zu Option 2 scrollen, wenn Sie möchten):
Option 1: Ich habe die Anweisungen aus dem ursprünglichen Artikel zum Codeprojekt hinzugefügt (siehe Link oben), da die dortigen Screenshots bereits verschwunden sind und ich nicht die gesamten Informationen verlieren möchte:
VS.Net führt keine Transformation durch, wenn Sie Ihre lokale Umgebung entwickeln und nur debuggen. Es gibt jedoch einige Schritte, die Sie ausführen können, um dies zu erreichen, wenn Sie möchten.
web.config
und wählen Sie Config Wandelt hinzufügen - das eine abhängige Transformation Config für jede Ihrer Konfigurationen definiert schaffen.web.config
in umbenennenweb.base.config
.web.config
Ihrem Projekt ein hinzu. Es spielt keine Rolle , was darin ist , weil es uns jedes Mal einen Build erhalten überschrieben wird tun , aber wir wollen , dass es Teil des Projekts so VS.Net gibt uns nicht das „Ihr Projekt ist nicht zum Debuggen konfiguriert“ Pop- oben..csproj
Projektdatei und fügen SieTransformXml
dem AfterBuild-Ziel die folgende Aufgabe hinzu. Hier können Sie sehen, dass ich dieweb.base.config
Datei mit dem transformiereweb.[configuration].config
und sie unter speichereweb.config
. Für Details klicken Sie bitte auf diesen Microsoft Q & A, sowie Anweisungen , wie die Build zu erweitern, suchen Sie es .Option 2:
Basierend auf dieser Antwort habe ich eine einfache Konsolen-App entwickelt, TransformConfig.exe (in C # 6.0-Syntax):
Stellen Sie sicher, dass Sie die DLL
"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
als Referenz hinzufügen (dieses Beispiel gilt für VS 2015, bei älteren Versionen ersetzen Sie diev14.0
im Pfad durch die entsprechende Versionsnummer, zv11.0
. B. ).Für Visual Studio 2017 hat sich das Namensschema für den Pfad geändert: Für die Unternehmensversion ist es beispielsweise hier :
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.Ich gehe davon aus, dass Sie für die Professional-Version
Enterprise
im Pfad durch ersetzen müssenProfessional
. Wenn Sie die Vorschau-Version verwenden, ersetzen Sie diese zusätzlich2017
durchPreview
.Hier ein Überblick , wie der Weg für verschiedene Versionen von Visual Studio geändert hat (wenn Sie nicht über die Enterprise - Version haben könnten ersetzen müssen
Enterprise
durchProfessional
auf dem Weg):Kompilieren Sie es und legen Sie die EXE-Datei in einem Verzeichnis ab, z
C:\MyTools\
.Verwendung: Sie können es in Ihrem Post-Build-Ereignis verwenden ( wählen Sie in den Projekteigenschaften Build-Ereignisse aus und bearbeiten Sie die Befehlszeile für das Post-Build-Ereignis ). Befehlszeilenparameter sind (Beispiel):
dh zuerst den Namen der Konfigurationsdatei, gefolgt von der Transformationskonfigurationsdatei, gefolgt von einer optionalen Vorlagenkonfiguration, gefolgt vom Pfad zu Ihrem Projekt, das beide Dateien enthält.
Ich habe den optionalen Vorlagenkonfigurationsparameter hinzugefügt, da sonst Ihre ursprüngliche vollständige Konfiguration durch die Transformation überschrieben würde, was durch die Bereitstellung einer Vorlage vermieden werden kann.
Erstellen Sie die Vorlage, indem Sie einfach die ursprüngliche Web.config kopieren und Web.Template.config nennen.
Hinweis:
Wenn Sie möchten, können Sie die
TransformConfig.exe
Datei auch in den oben genannten Visual Studio-Pfad kopieren, in dem sich die DateiMicrosoft.Web.XmlTransform.dll
befindet, und in all Ihren Projekten darauf verweisen, in denen Sie Ihre Konfigurationen transformieren müssen.Für diejenigen unter Ihnen, die sich fragen, warum ich
Environment.ExitCode = x;
Zuweisungen hinzugefügt habe : Die einfache Rückgabe eines Int von Main hat beim Build-Ereignis nicht geholfen. Details finden Sie hier.Wenn Sie Ihr Projekt veröffentlichen und Sie eine Web.Template.config verwenden, stellen Sie sicher , dass Sie eine haben wieder aufbauen auf Ihrer Lösung mit der richtigen Konfiguration ( in der Regel Release) , bevor Sie veröffentlichen. Der Grund dafür ist, dass die Web.Config beim Debuggen überschrieben wird und Sie möglicherweise die falsche Datei anderweitig transformieren.
quelle
Die Beantwortung Ihrer Frage ist nicht einfach, da sie ein Problem darstellt - wenn Sie Web.config mit Web.debug.config transformieren möchten - wo sollte der Transformationseffekt gespeichert werden? In Web.config selbst? Dies würde die Transformationsquelldatei überschreiben! Wahrscheinlich führt Visual Studio deshalb während der Erstellung keine Transformationen durch.
Die vorherige Antwort von Matt ist gültig, aber Sie können sie mischen, um eine generische Lösung zu erhalten, die funktioniert, wenn Sie die Konfiguration der aktiven Lösung tatsächlich von Debug auf Release usw. ändern. Hier ist eine einfache Lösung:
Web.config
DateiWeb.base.config
- Transformationen sollten automatisch umbenennen entsprechend (Web.base.Debug.config
etc)Wenn Sie jetzt Ihre Lösung erstellen, wird eine Web.config-Datei mit gültigen Transformationen für die aktive Konfiguration erstellt.
quelle
'"$(MSBuildBinPath)\msbuild.exe" $(ProjectDir)TransformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath)
und aktualisiert ,v12.0
umv14.0
in der .proj Datei.12.0
zu14.0
für VS 2017 habe ich die Antwort gefunden hier nicht sicher, warum niemand oben darauf verwiesen hat, da es eine sehr beliebte Lösung zu sein scheint. Sehr einfach auch. Stellen Sie sicher, dass Sie den Kommentar von IOrlandoni am 5. März 2019 sehen, damit es in VS 2017 und allen Versionen funktioniert.
Grundsätzlich ist es ein Zwei-Schritt. Zuerst bearbeiten Sie die .csproj-Datei und fügen den folgenden Code hinzu. Zweitens erstellen Sie eine neue web.base.config-Konfiguration und kopieren dort die vorhandene web.config. Danach überschreibt jeder Build Ihre web.config mit der gewünschten Transformation.
quelle
Web.config
vonContent
zu wechseln ,None
können SieSource="Web.config" Destination="$(TargetPath).config"
(oder möglicherweise für einige ProjekttypenDestination="$(TargetDir)Web.config"
) verwenden. Ich habe die Transformation auch nach verschobenAfterBuild
, da sie nicht mehr ausgeführt werden muss, bevor Dateien kopiert werden.bin
.Ihre unmittelbare Frage wurde beantwortet - die Erklärung ist, dass die Transformation beim Veröffentlichen und nicht beim Erstellen angewendet wird.
Ich denke jedoch, dass es keine Lösung bietet, wie Sie das erreichen können, was Sie tun möchten.
Ich habe seit einigen Tagen mit genau diesem Problem zu kämpfen und nach einer Möglichkeit gesucht, web.config sauber zu halten und alle Schlüssel festzulegen, die je nach Umgebung in den jeweiligen Transformationsdateien variieren. Mein Fazit ist, dass die einfachste und stabilste Lösung darin besteht, Debug-Werte in der ursprünglichen web.config zu verwenden. Auf diese Weise sind sie immer vorhanden, wenn Sie Debug-Läufe in Visual Studio ausführen.
Erstellen Sie dann Transformationen für die verschiedenen Umgebungen, in denen Sie veröffentlichen möchten - Test, Integration, Produktion - was auch immer Sie haben. Hierfür reicht die jetzt integrierte Funktionalität zum Transformieren von web.config-Dateien beim Veröffentlichen aus. Keine Notwendigkeit für SlowCheetah oder das Bearbeiten von Build-Ereignissen oder Projektdateien. Wenn Sie nur Webprojekte haben, ist das.
Wenn Sie möchten, können Sie auch die Datei web.debug.config in Ihrer Lösung haben, um eine separate Datei mit allen Werten für die Entwicklungsumgebung zu erstellen. Stellen Sie sicher, dass die Werte bei der Ausführung in Visual Studio nicht angewendet werden, falls jemand anderes versucht, sie für diesen Zweck zu verwenden!
quelle
Verwenden Sie Octopus Deploy (Community Edition ist kostenlos) und lassen Sie es das
web.config
für Sie transformieren . Schritte:Web.Release.config
dieBuild Action
EigenschaftContent
genau wie für Ihre Hauptdatei festgelegtweb.config
ist.Das ist es! Octopus erledigt den Rest ohne spezielle Konfiguration. Bei einer Standardbereitstellung der IIS-Website wird dies sofort ausgeführt:
quelle
Anscheinend gibt es eine Erweiterung für Visual Studio 2015
https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e
Mit diesem Paket können Sie Ihre app.config oder eine andere XML-Datei basierend auf der Build-Konfiguration transformieren
quelle
new
Welt als Satz entfernt.Vor kurzem hatte ich das gleiche Problem mit einer älteren web.config- Datei, die auf .NET Framework 2.0 basiert. Die Lösung wurde entfernen Sie einfach den web.config Namespace ( xmlns in attibute Konfiguration root node):
VOR:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
NACH DEM:
<configuration>
quelle