visual studio asp.net asp.net-mvc web-config slowcheetah web-config-transform

asp.net - studio - Web Config Transform no funciona



slowcheetah visual studio 2017 (7)

Al parecer hay una extensión para Visual Studio 2015

https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e

Este paquete le permite transformar su app.config o cualquier otro archivo XML basado en la configuración de compilación

En una aplicación .NET MVC 3.0 tengo la siguiente configuración en la configuración de appSettings :

web.config

<appSettings> <add key="SMTPHost" value="mail.domain.com"/> <add key="SMTPUsername" value="[email protected]"/> <add key="SMTPPort" value="25"/> <add key="SMTPPwd" value="mypassword"/> <add key="EmailFrom" value="[email protected]"/> </appSettings>

Para la depuración, tengo definida la siguiente transformación de configuración:

web.Debug.config

<appSettings> <add key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" /> </appSettings>

Y ejecuto la aplicación en modo de depuración, pero mi puerto SMTP sigue tomando el valor de web.config , no web.Debug.config .

¿Alguien puede sugerir qué podría estar mal en esta configuración?


Lamentablemente, Visual Studio (2010 - 2017) no lo admite directamente mientras realiza la depuración, solo está destinado a 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 que se describe 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 la Opción 1 , pero recientemente descubrí otra Opción 2 , que es más fácil de usar (por lo que puede desplazarse hacia la opción 2 directamente si lo desea):

Opción 1: He agregado las instrucciones tomadas del artículo del proyecto original (vea el enlace de arriba), porque las capturas de pantalla ya han desaparecido 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 hacer para que esto suceda si lo desea.

  • Primero, cree las configuraciones que desee en VS.Net , asumiendo que la depuración y la versión predeterminadas no son suficientes para lo que está tratando de lograr.
  • Haga clic con el botón derecho en su configuración web.config y seleccione Agregar transformaciones de configuración : esto creará una configuración de transformación dependiente para cada una de las configuraciones definidas.
  • Ahora puede cambiar el nombre de su web.config a web.base.config .
  • Agrega un web.config a tu proyecto. No importa lo que contenga , ya que se sobrescribirá cada vez que realicemos una compilación, pero queremos que forme parte del proyecto, por lo que VS.Net no nos ofrece la ventana emergente "Su proyecto no está configurado para la depuración". arriba.
  • Edite su .csproj proyecto .csproj y agregue la siguiente tarea TransformXml al destino AfterBuild. Aquí puede ver que voy a transformar el archivo web.base.config utilizando la web.[configuration].config y lo guardará como web.config . Para obtener más información, consulte this Q&A de Microsoft, y para obtener instrucciones sobre cómo ampliar la compilación, consulte there .

Opcion 2:

Basándome en this respuesta, he desarrollado una aplicación de consola simple, TransformConfig.exe (en 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 la v14.0 en la ruta por el número de versión apropiado, p. ej. v11.0 ).

Para Visual Studio 2017, el esquema de nombres para la ruta ha cambiado: por ejemplo, para la versión empresarial está aquí: C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/Microsoft/VisualStudio/v15.0/Web .
Supongo que para la versión profesional necesita reemplazar Enterprise en la ruta por Professional . Si está utilizando la versión de vista previa, reemplace adicionalmente 2017 por Preview .

Compílelo y coloque el archivo .exe en un directorio, por ejemplo, C:/MyTools/ .

Uso: Puede usarlo en su evento de compilación posterior (en las propiedades del proyecto , seleccione Eventos de compilación y luego edite la línea de comandos 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 al proyecto que contiene ambos archivos.

He agregado el parámetro de configuración de plantilla opcional porque, de lo contrario, su configuración completa original se sobrescribiría con la transformación, 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 archivo TransformConfig.exe a la ruta de Visual Studio mencionada anteriormente donde reside el Microsoft.Web.XmlTransform.dll y referirse a él en todos sus proyectos donde necesite transformar sus configuraciones.

  • Para aquellos de ustedes que se preguntan por qué agregué Environment.ExitCode = x; tareas: el simple hecho de devolver un int desde Main no ayudó en el evento de compilación. Vea los detalles here.

  • Si está publicando su proyecto y está utilizando un Web.Template.config, asegúrese de haber realizado una reconstrucción de su solución con la configuración correcta (generalmente, la versión) antes de publicar. La razón es que el Web.Config se sobrescribe durante la depuración y, de lo contrario, podría transformar el archivo incorrecto.



Recientemente tuve el mismo problema con un archivo web.config antiguo basado en .NET Framework 2.0. La solución fue simplemente eliminar el espacio de nombres de web.config ( xmlns attibute en la configuración del nodo raíz):

ANTES: <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

DESPUÉS: <configuration>


Responder a su pregunta no es simple, porque plantea un problema, si desea transformar Web.config con Web.debug.config, ¿dónde debería almacenarse el efecto de transformación? ¿En web.config en sí? Esto sobrescribiría el archivo fuente de transformación! Probablemente es por eso que Visual Studio no hace transformaciones durante las compilaciones.

La respuesta anterior de Matt es válida, pero es posible que desee combinarlas para tener una solución genérica que funcione cuando realmente se cambia la configuración de la solución activa de depuración a la versión, etc. Aquí hay una solución simple:

  1. Cree sus transformaciones de configuración para configuraciones (depuración, lanzamiento, etc.)
  2. Cambiar el nombre del archivo Web.config a Web.base.config : las transformaciones deben cambiar automáticamente el nombre en consecuencia ( Web.base.Debug.config , etc.)
  3. Agregue el siguiente archivo XML transformWebConfig.proj a su carpeta de proyecto:

<?xml version="1.0" encoding="utf-8" ?> <Project ToolsVersion="4.0" DefaultTargets="TransformWebConfig" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)/Microsoft/VisualStudio/v12.0/Web/Microsoft.Web.Publishing.Tasks.dll" /> <Target Name="TransformWebConfig"> <TransformXml Source="Web.base.config" Transform="Web.base.$(CurrentConfig).config" Destination="Web.config" /> </Target> </Project>

  1. Navegue a las propiedades de su proyecto, elija Crear eventos y agregue el siguiente contenido a la línea de comandos de eventos posteriores a la construcción :

@if exist "%ProgramFiles(x86)%/MSBuild/12.0/bin" set PATH=%ProgramFiles(x86)%/MSBuild/12.0/bin;%PATH% msbuild $(ProjectDir)transformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath)

Ahora, cuando construya su solución, se creará un archivo Web.config con transformaciones válidas para la configuración activa.


Su pregunta inmediata ha sido respondida: la explicación es que la transformación se aplica en la publicación, no en la compilación.

Sin embargo, creo que no ofrece una solución sobre cómo lograr lo que quieres hacer.

He estado luchando con este problema exacto durante unos días, buscando una manera de mantener web.config limpio y configurar todas las claves que varían según el entorno en los respectivos archivos de transformación. Mi conclusión es que la solución más fácil y estable es usar los valores de depuración en el web.config original, de esa manera siempre están presentes cuando se ejecutan las tareas de depuración en Visual Studio.

Luego cree transformaciones para los diferentes entornos en los que desea publicar: prueba, integración, producción, lo que sea que tenga. La funcionalidad ahora integrada para transformar los archivos web.config en la publicación será suficiente para esto. No necesita SlowCheetah ni editar eventos de compilación ni archivos de proyecto. Si solo tienes proyectos web eso es.

Si lo desea, también puede tener el archivo web.debug.config en su solución, solo para mantener un archivo separado con todos los valores relacionados con el entorno de desarrollo. ¡Asegúrese de comentar que los valores no se aplican cuando se ejecuta en Visual Studio, en caso de que alguien intente usarlo para ese propósito!


Use Octopus Deploy (la edición comunitaria es gratuita) y deje que transforme web.config por usted. Pasos:

  1. Configura Octopus para desplegar tu aplicación web.
  2. Asegúrese de que su Web.Release.config tenga la propiedad Build Action configurada en Content como su archivo web.config principal.

¡Eso es! Octopus hará el resto sin ninguna configuración especial. Una implementación predeterminada del sitio web de IIS lo hará de forma inmediata: