Visual Studio (2010-2019) niestety nie obsługuje go bezpośrednio podczas debugowania, jest przeznaczony tylko do publikacji - nawet z rozszerzeniem SlowCheetah (zaznaczona odpowiedź) nie działa dla mnie (tylko dla projektów korzystających z app.config zamiast web.config).
Zauważ, że istnieje obejście opisane w codeproject .
Opisuje, jak zmodyfikować plik .msproj, aby nadpisać bieżący plik web.config przekształconą wersją.
Najpierw opiszę to obejście jako opcję 1 , ale niedawno odkryłem inną opcję 2 , która jest łatwiejsza w użyciu (więc możesz przewinąć bezpośrednio w dół do opcji 2, jeśli chcesz):
Opcja 1: Dodałem instrukcje zaczerpnięte z oryginalnego artykułu codeproject (patrz link powyżej), ponieważ zrzuty ekranów już tam nie ma, a nie chcę stracić całej informacji:
VS.Net nie dokonuje żadnych zmian podczas programowania i debugowania lokalnego środowiska. Ale jest kilka kroków, które możesz zrobić, aby tak się stało, jeśli chcesz.
- Najpierw utwórz żądane konfiguracje w VS.Net , zakładając, że domyślne debugowanie i wydanie nie wystarczą do tego, co próbujesz osiągnąć.
- Kliknij prawym przyciskiem myszy
web.config
i wybierz Dodaj konfigurację transformacji - spowoduje to utworzenie zależnej konfiguracji transformacji dla każdej zdefiniowanej konfiguracji.
- Teraz możesz zmienić nazwę
web.config
na web.base.config
.
- Dodaj
web.config
do swojego projektu. Nie ma znaczenia, co w niej jest, ponieważ będzie nadpisany za każdym razem robimy build ale chcemy to część projektu tak VS.Net nie dają nam „Twój projekt nie jest skonfigurowany do debugowania” Pop- w górę.
- Edytuj
.csproj
plik projektu i dodaj następujące TransformXml
zadanie do elementu docelowego AfterBuild. Tutaj możesz zobaczyć, że będę przekształcał web.base.config
plik przy użyciu web.[configuration].config
i zapisze go jako web.config
. Aby uzyskać szczegółowe informacje, proszę sprawdzić to Microsoft Q & A, i instrukcje Jak przedłużyć build, spójrz tam .
Opcja 2:
Na podstawie tej odpowiedzi opracowałem prostą aplikację konsolową TransformConfig.exe (w składni C # 6.0):
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);
}
}
}
Upewnij się, że dodano bibliotekę DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
jako odwołanie (ten przykład dotyczy programu VS 2015, w przypadku starszych wersji należy zastąpić v14.0
w ścieżce odpowiedni numer wersji, np v11.0
.).
Dla Visual Studio 2017, schemat nazewnictwa dla ścieżki nie zmieniło: Na przykład dla wersji Enterprise jest tutaj: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Zakładam, że dla wersji profesjonalnej trzeba Enterprise
w ścieżce wymienić wg Professional
. Jeśli używasz wersji zapoznawczej, dodatkowo zamień 2017
na Preview
.
Oto omówienie, jak zmieniła się ścieżka dla różnych wersji programu Visual Studio (jeśli nie masz wersji Enterprise, może być konieczne zastąpienie Enterprise
przez Professional
w ścieżce):
Ścieżka do Microsoft.Web.XmlTransform.dll
wersji VS (dla )
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
Skompiluj go i umieść plik .exe w katalogu np C:\MyTools\
.
Użycie:
Możesz go użyć w zdarzeniu po kompilacji (we właściwościach projektu wybierz Zdarzenia kompilacji , a następnie edytuj wiersz poleceń zdarzenia po kompilacji ). Parametry wiersza poleceń to (przykład):
„C: \ MyTools \ TransformConfig.Exe” /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: „$ (ProjectDir) \”
tj. najpierw nazwa pliku konfiguracyjnego, następnie plik konfiguracyjny transformacji, następnie opcjonalna konfiguracja szablonu, a następnie ścieżka do projektu zawierającego oba pliki.
Dodałem opcjonalny parametr konfiguracji szablonu, ponieważ w przeciwnym razie oryginalna kompletna konfiguracja zostałaby nadpisana przez transformację, czego można uniknąć, udostępniając szablon.
Utwórz szablon, po prostu kopiując oryginalny plik Web.config i nadaj mu nazwę Web.Template.config.
Uwaga:
Jeśli wolisz, możesz również skopiować TransformConfig.exe
plik do wspomnianej powyżej ścieżki programu Visual Studio, w której Microsoft.Web.XmlTransform.dll
znajduje się plik, i odwoływać się do niego we wszystkich projektach, w których musisz przekształcić konfiguracje.
Dla tych z Was, którzy zastanawiają się, dlaczego dodałem Environment.ExitCode = x;
zadania: Zwrócenie int z Main nie pomogło w zdarzeniu kompilacji. Zobacz szczegóły tutaj.
Jeśli publikujesz swój projekt i używasz pliku Web.Template.config, upewnij się, że przed opublikowaniem dokonałeś przebudowy rozwiązania z odpowiednią konfiguracją (zwykle Release). Powodem jest to, że plik Web.Config jest nadpisywany podczas debugowania iw przeciwnym razie może skończyć się przekształceniem niewłaściwego pliku.