Visual Studio (2010-2019) purtroppo non lo supporta direttamente durante il debug, è inteso solo per la pubblicazione - anche con l'estensione SlowCheetah (risposta contrassegnata) non funziona per me (solo per progetti che utilizzano app.config anziché web.config).
Notare che esiste una soluzione alternativa descritta in codeproject .
Descrive come modificare il file .msproj per sovrascrivere il web.config corrente con la versione trasformata.
Descriverò prima quella soluzione alternativa come Opzione 1 , ma di recente ho scoperto un'altra opzione 2 , che è più facile da usare (quindi puoi scorrere direttamente fino all'opzione 2 se lo desideri):
Opzione 1: ho aggiunto le istruzioni tratte dall'articolo originale del progetto di codice (vedi il link sopra), perché le schermate sono già sparite e non voglio perdere l'intera informazione:
VS.Net non esegue alcuna trasformazione durante lo sviluppo e il debug dell'ambiente locale. Ma ci sono alcuni passaggi che puoi fare per farlo accadere, se lo desideri.
- Innanzitutto, crea le configurazioni che desideri in VS.Net , assumendo che il debug e il rilascio predefiniti non siano sufficienti per ciò che stai cercando di ottenere.
- Fare clic con il pulsante destro del mouse
web.config
e selezionare Aggiungi trasformazioni di configurazione : questo creerà una configurazione di trasformazione dipendente per ciascuna delle configurazioni definite.
- Ora puoi rinominare il tuo
web.config
in web.base.config
.
- Aggiungi una
web.config
al tuo progetto. Non importa cosa c'è dentro perché verrà sovrascritto ogni volta che facciamo una compilazione, ma vogliamo che faccia parte del progetto in modo che VS.Net non ci dia il pop "Il tuo progetto non è configurato per il debug "- su.
- Modifica il tuo
.csproj
file di progetto e aggiungi la seguente TransformXml
attività alla destinazione AfterBuild. Qui puoi vedere che trasformerò il web.base.config
file usando il web.[configuration].config
e lo salverò come web.config
. Per i dettagli, consultare queste domande e risposte di Microsoft e per istruzioni su come estendere la build, vedere lì .
Opzione 2:
Sulla base di questa risposta, ho sviluppato una semplice app per console, TransformConfig.exe (con sintassi 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);
}
}
}
Assicurarsi di aggiungere la DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
come riferimento (questo esempio si applica a VS 2015, per le versioni precedenti sostituire il v14.0
nel percorso con il numero di versione appropriato, ad esempio v11.0
).
Per Visual Studio 2017, sullo schema di denominazione per il percorso è cambiato: per esempio, per la versione enterprise è qui: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Presumo che per la versione professionale sia necessario sostituire Enterprise
nel percorso da Professional
. Se stai utilizzando la versione di anteprima, sostituisci inoltre 2017
con Preview
.
Ecco una panoramica di come il percorso è cambiato per le diverse versioni di Visual Studio (se non si dispone della versione Enterprise può essere necessario sostituire Enterprise
da Professional
nel percorso):
VS Version Path (for 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
Compilalo e metti il file .exe in una directory, ad es C:\MyTools\
.
Utilizzo:
puoi usarlo nel tuo evento post build (nelle proprietà del progetto , seleziona Build Events , quindi modifica la riga di comando dell'evento post build ). I parametri della riga di comando sono (esempio):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
cioè prima il nome del file di configurazione, seguito dal file di configurazione della trasformazione, seguito da un modello di configurazione opzionale, seguito dal percorso del progetto contenente entrambi i file.
Ho aggiunto il parametro di configurazione del modello opzionale perché altrimenti la configurazione completa originale verrebbe sovrascritta dalla trasformazione, cosa che può essere evitata fornendo un modello.
Crea il modello semplicemente copiando il Web.config originale e chiamalo Web.Template.config.
Nota:
Se preferisci, puoi anche copiare il TransformConfig.exe
file nel percorso di Visual Studio sopra menzionato dove Microsoft.Web.XmlTransform.dll
risiede e fare riferimento ad esso in tutti i tuoi progetti in cui devi trasformare le tue configurazioni.
Per quelli di voi che si stanno chiedendo perché ho aggiunto gli Environment.ExitCode = x;
incarichi: semplicemente restituire un int da Main non ha aiutato nell'evento build. Vedi i dettagli qui.
Se stai pubblicando il tuo progetto e stai usando un Web.Template.config, assicurati di aver fatto una ricostruzione sulla tua soluzione con la giusta configurazione (di solito Release) prima di pubblicare. Il motivo è che Web.Config viene sovrascritto durante il debug e potresti finire per trasformare il file sbagliato altrimenti.