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.configi wybierz Dodaj konfigurację transformacji - spowoduje to utworzenie zależnej konfiguracji transformacji dla każdej zdefiniowanej konfiguracji.
- Teraz możesz zmienić nazwę
web.configna web.base.config.
- Dodaj
web.configdo 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
.csprojplik projektu i dodaj następujące TransformXmlzadanie do elementu docelowego AfterBuild. Tutaj możesz zobaczyć, że będę przekształcał web.base.configplik przy użyciu web.[configuration].configi 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.0w ś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 Enterprisew ścieżce wymienić wg Professional. Jeśli używasz wersji zapoznawczej, dodatkowo zamień 2017na 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 Enterpriseprzez Professionalw ścieżce):
Ścieżka do Microsoft.Web.XmlTransform.dllwersji 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.exeplik do wspomnianej powyżej ścieżki programu Visual Studio, w której Microsoft.Web.XmlTransform.dllznajduje 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.