Visual Studio (2010 - 2019) desafortunadamente no lo admite directamente mientras está depurando, solo está destinado a la publicación; incluso con la extensión SlowCheetah (respuesta marcada) no funciona para mí (solo para proyectos que usan app.config en lugar de web.config).
Tenga en cuenta que hay una solución alternativa descrita en codeproject .
Describe cómo modificar el archivo .msproj para sobrescribir el web.config actual por la versión transformada.
Primero describiré esa solución como Opción 1 , pero recientemente descubrí otra Opción 2 , que es más fácil de usar (por lo que puede desplazarse hacia abajo hasta la opción 2 directamente si lo desea):
Opción 1: agregué las instrucciones tomadas del artículo del proyecto de código original (vea el enlace de arriba), porque las capturas de pantalla ya se han ido y no quiero perder toda la información:
VS.Net no realiza ninguna transformación cuando está desarrollando y simplemente depurando su entorno local. Pero hay algunos pasos que puede seguir para que esto suceda si lo desea.
- Primero, cree las configuraciones que desee en VS.Net , asumiendo que la depuración y la liberación predeterminadas no son suficientes para lo que está tratando de lograr.
- Haga clic con el botón derecho en su
web.config
y seleccione Agregar transformaciones de configuración ; esto creará una configuración de transformación dependiente para cada una de sus configuraciones definidas.
- Ahora puedes cambiar el nombre de tu
web.config
a web.base.config
.
- Agrega un
web.config
a tu proyecto. No importa lo que está en ella, ya que se sobrescribirá cada vez que hace una compilación pero queremos que parte del proyecto de manera VS.Net no nos la da "su proyecto no está configurado para la depuración" emergente arriba.
- Edite su
.csproj
archivo de proyecto y agregue la siguiente TransformXml
tarea al destino AfterBuild. Aquí puede ver que voy a transformar el web.base.config
archivo usando el web.[configuration].config
y lo guardaré como web.config
. Para obtener más información, consulte estas preguntas y respuestas de Microsoft y, para obtener instrucciones sobre cómo extender la compilación, consulte allí .
Opcion 2:
Basado en esta respuesta, he desarrollado una aplicación de consola simple, TransformConfig.exe (en la sintaxis de 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);
}
}
}
Asegúrese de agregar la DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
como referencia (este ejemplo se aplica a VS 2015, para versiones anteriores, reemplace v14.0
en la ruta por el número de versión apropiado, por ejemplo v11.0
).
Para Visual Studio 2017, el esquema de nomenclatura para la ruta ha cambiado: Por ejemplo, para la versión de la empresa es aquí: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Supongo que para la versión profesional debe reemplazar Enterprise
en la ruta por Professional
. Si está utilizando la versión de vista previa, reemplace adicionalmente 2017
por Preview
.
He aquí un resumen de cómo el camino ha cambiado para diferentes versiones de Visual Studio (si no tiene la versión de la empresa puede que tenga que sustituir Enterprise
por Professional
en el camino):
Ruta de la Microsoft.Web.XmlTransform.dll
versión VS (para )
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
Compílelo y coloque el archivo .exe en un directorio, por ejemplo C:\MyTools\
.
Uso:
puede usarlo en su evento posterior a la compilación (en las propiedades del proyecto , seleccione Eventos de compilación y luego edite la línea de comando del evento posterior a la compilación ). Los parámetros de la línea de comandos son (ejemplo):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
es decir, primero el nombre del archivo de configuración, seguido del archivo de configuración de transformación, seguido de una configuración de plantilla opcional, seguida de la ruta a su proyecto que contiene ambos archivos.
He agregado el parámetro de configuración de plantilla opcional porque, de lo contrario, la transformación sobrescribirá su configuración original completa, lo que puede evitarse proporcionando una plantilla.
Cree la plantilla simplemente copiando el Web.config original y asígnele el nombre Web.Template.config.
Nota:
Si lo prefiere, también puede copiar el TransformConfig.exe
archivo a la ruta de Visual Studio mencionada anteriormente donde Microsoft.Web.XmlTransform.dll
reside y consultarlo en todos sus proyectos donde necesita transformar sus configuraciones.
Para aquellos de ustedes que se preguntan por qué agregué Environment.ExitCode = x;
asignaciones: simplemente devolver un int de Main no ayudó en el evento de compilación. Vea los detalles aquí.
Si está publicando su proyecto y está utilizando un Web.Template.config, asegúrese de haber reconstruido su solución con la configuración correcta (generalmente Release) antes de publicar. La razón es que Web.Config se sobrescribe durante la depuración y, de lo contrario, podría terminar transformando el archivo incorrecto.