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.
- Erstellen Sie zunächst die gewünschten Konfigurationen in VS.Net , vorausgesetzt, das Standard-Debugging und die Standardversion reichen nicht für das aus, was Sie erreichen möchten .
- Rechts auf klicken
web.config
und wählen Sie Config Wandelt hinzufügen - das eine abhängige Transformation Config für jede Ihrer Konfigurationen definiert schaffen.
- Jetzt können Sie Ihre
web.config
in umbenennen web.base.config
.
- Fügen Sie
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.
- Bearbeiten Sie Ihre
.csproj
Projektdatei und fügen Sie TransformXml
dem AfterBuild-Ziel die folgende Aufgabe hinzu. Hier können Sie sehen, dass ich die web.base.config
Datei mit dem transformiere web.[configuration].config
und sie unter speichere web.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):
using System;
using System.Linq;
using Microsoft.Web.XmlTransform;
namespace TransformConfig
{
class Program
{
static int Main(string[] args)
{
var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents";
var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects";
string srcConfigFileName = "Web.config";
string tgtConfigFileName = srcConfigFileName;
string transformFileName = "Web.Debug.config";
string basePath = myVsProjects + @"\";
try
{
var numArgs = args?.Count() ?? 0;
if (numArgs == 0 || args.Any(x=>x=="/?"))
{
Console.WriteLine("\nTransformConfig - Usage:");
Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]");
Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded.");
Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):");
Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\"");
Environment.ExitCode = 1;
return 1;
}
foreach (var a in args)
{
var param = a.Trim().Substring(3).TrimStart();
switch (a.TrimStart().Substring(0,2).ToLowerInvariant())
{
case "/d":
tgtConfigFileName = param ?? tgtConfigFileName;
break;
case "/t":
transformFileName = param ?? transformFileName;
break;
case "/b":
var isPath = (param ?? "").Contains("\\");
basePath = (isPath == false)
? $@"{myVsProjects}\" + param ?? ""
: param;
break;
case "/s":
srcConfigFileName = param ?? srcConfigFileName;
break;
default:
break;
}
}
basePath = System.IO.Path.GetFullPath(basePath);
if (!basePath.EndsWith("\\")) basePath += "\\";
if (tgtConfigFileName != srcConfigFileName)
{
System.IO.File.Copy(basePath + srcConfigFileName,
basePath + tgtConfigFileName, true);
}
TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName);
Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'.");
Environment.ExitCode = 0;
return 0;
}
catch (Exception ex)
{
var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}";
Console.WriteLine($"TransformConfig - Exception occurred: {msg}");
Console.WriteLine($"TransformConfig - Processing aborted.");
Environment.ExitCode = 2;
return 2;
}
}
public static void TransformConfig(string configFileName, string transformFileName)
{
var document = new XmlTransformableDocument();
document.PreserveWhitespace = true;
document.Load(configFileName);
var transformation = new XmlTransformation(transformFileName);
if (!transformation.Apply(document))
{
throw new Exception("Transformation Failed");
}
document.Save(configFileName);
}
}
}
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 die v14.0
im Pfad durch die entsprechende Versionsnummer, z v11.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üssen Professional
. Wenn Sie die Vorschau-Version verwenden, ersetzen Sie diese zusätzlich 2017
durch Preview
.
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
durch Professional
auf dem Weg):
VS Versionspfad (für Microsoft.Web.XmlTransform.dll
)
2015 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
2017 C:\Program Files (x86)\Microsoft Visual Studio\2017\
Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
2019 C:\Program Files (x86)\Microsoft Visual Studio\2019\
Enterprise\MSBuild\Microsoft\VisualStudio\v16.0\Web
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):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
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 Datei Microsoft.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.