14

¿Hay alguna herramienta o extensión de Visual Studio 2010 que me permita ver el resultado de una transformación del archivo de configuración sin tener que publicar todo el proyecto? ¿Es el proceso que realiza la transformación directamente invocable?Herramientas para obtener una vista previa de las transformaciones del archivo de configuración


Edición

Después de un poco más de buscar en Google me encontré con this:

Paso 4: Generación de un nuevo archivo web.config transformado para el medio ambiente “puesta en escena” de línea de comando

Abrir el símbolo de comandos de Visual Studio por ir a Inicio -> Archivos de programa -> Visual Studio v10.0 -> Visual Studio herramientas -> Visual Studio 10.0 Comando Prompt

Tipo “MSBuild“Camino al proyecto de aplicación presentar (.csproj/.vbproj)” /t: TransformWebConfig /p: Configuración = Puesta en escena" y pulsa enter como se muestra a continuación:

commandline web.config transformation

Una vez que la transformación es exitosa el web.config para la “puesta en escena” configuración se almacenarán en obj -> Staging carpeta en la raíz de su proyecto (en el Explorador de solución que pueda acceder a esta carpeta por primera los archivos ocultos un-ocultar):

transformed web.config

  • en el explorador de soluciones, haga clic en el botón para mostrar los archivos ocultos
  • Abrir la carpeta Obj
  • Vaya a la configuración activa (en nuestro cu rrent caso se trata de “puesta en escena”)
  • se puede encontrar el web.config transformado no

Ahora puede verificar que la nueva puesta en escena archivo web.config generado tiene la sección de cadena de conexión cambiada.

Fuente: Web Deployment: Web.Config Transformation

Esto no es realmente una solución perfecta para mí, ya que todavía requiere de la construcción de todo el proyecto- al menos con el comando que publicó. Si alguien sabe de la manera de omitir el paso de compilación con el comando MSBuild que sería útil (aunque eso suena un poco improbable).

Editar 2

También encontraron esta Config Transformation Tool en CodePlex, que ofrece algunas funciones agradable para extender el proceso de transformación. Esta herramienta es lo más cercano que he visto para la funcionalidad que estoy buscando y sería un gran punto de partida para desarrollar una extensión que crea vistas previas. Utiliza la biblioteca Microsoft.Web.Publishing.Tasks para realizar la transformación y no depende de crear un proyecto real.

Respuesta

7

Puede transformar un archivo de configuración utilizando los mismos objetos que utiliza la tarea MSBuild, omitiendo por completo MSBuild. La lógica de transformación de config web está contenida en la biblioteca Microsoft.Web.Publishing.Tasks.

El siguiente fragmento de código proviene de una biblioteca de clases simple, que hace referencia a la biblioteca Microsoft.Web.Publishing.Tasks (que está instalada en mi máquina en C: \ Archivos de programa (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10. 0 \ Web).

El ejemplo carga un documento de origen y transforma, aplica la transformación y escribe los resultados en un nuevo archivo.

using System; 
using Microsoft.Web.Publishing.Tasks; 

// ... 

var xmlTarget = new XmlTransformableDocument(); 
xmlTarget.PreserveWhitespace = true; 
xmlTarget.Load("Web.config"); 

var xmlTransform = new XmlTransformation("Web.Release.config"); 

if (xmlTransform.Apply(xmlTarget)) 
    xmlTarget.Save("Web.Transformed.config"); 
else 
    Console.WriteLine("Unable to apply transform."); 

Con un poco de creatividad, esta solución sencilla podría integrarse en un plug-in Visual Studio, tal vez como un elemento del menú contextual en el archivo web.config. Como mínimo, puede crear una utilidad de consola o un script para generar vistas previas.

¡Buena suerte!

+0

esto es esencialmente una expansión de mi párrafo "Editar 2". Siento que hay al menos alguna necesidad de una herramienta como esta y empiezo a armar las piezas yo mismo. Con un poco de suerte, espero lanzar algo en la Galería de extensiones en el futuro cercano.¡Gracias por la aportación! –

+0

@Nathan: Buena suerte con la extensión. Espero verlo. La herramienta CodePlex funciona invocando MSBuild. Para una herramienta personalizada, es probable que desee utilizar la biblioteca directamente como se muestra. Hazme un favor y agrega un comentario cuando termines. ¡Buena suerte! – kbrimington

+0

Inicialmente pensé que funcionaba al invocar MSBuild, pero después de explorar la fuente, me di cuenta de que estaba utilizando las bibliotecas que mencionaste anteriormente. Por lo que parece, no debería ser difícil construir un prototipo funcional de la extensión. –

12

El SlowCheetah VS complemento en la visualstudiogallery le permite una vista previa de los resultados transformar

+1

Sí SlowCheetah hace esto en un clic derecho así que es perfecto para esto –

+0

Después de luchar con una transformación durante la última media hora pensé en googlear para herramientas de transformación, vine aquí, lo instalé y mostró mi problema de inmediato. Reparado en 2 minutos. Agregado a mi "imprescindible, ¿cómo me las arreglé sin él antes?" kit de herramientas. –

2

Mensaje viejo, pero pensaba que iba a compartir lo que había encontrado con una rápida de Google (para aquellos que no han encontrado o trataron aquí en primer lugar):

Web.config Transformation Tester - By AppHarbor
Basta con pegar el código XML original, junto con el código XML transformación y ver el resultado instantáneamente.

Además, es open source para cualquier persona que esté interesada.

0

Solo para extender esto un poco. Necesitaba exactamente lo que se discutió anteriormente. Para poder ejecutar solo la transformación. Luego enganche eso en mi proceso de compilación, que en mi caso es TeamCity.

Necesitará utilizar Microsoft.Web.Publishing.Tasks, que puede destruir con Nuget. Bueno, yo estaba en VS2013, así que pude. Estoy seguro de que podrías adquirir el dll de lo contrario.

Escribió una sencilla aplicación de consola. Lo podrías encontrar útil.

Program.cs

using System; 

namespace WebConfigTransform 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 3) 
      { 
       Console.WriteLine("Config Gen ... usage -source -transform -destination"); 
       Environment.Exit(-1); 
      } 

      Transform t = new Transform(args[0], args[1], args[2]); 
      t.Run(); 
     } 
    } 
} 

Transform.cs

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Security; 
using System.Security.Permissions; 
using Microsoft.Web.XmlTransform; 

namespace WebConfigTransform 
{ 
    class Transform 
    { 
     private readonly string m_source; 
     private readonly string m_transform; 
     private readonly string m_destination; 

     public Transform(string source, string transform, string destination) 
     { 
      m_source = source; 
      m_transform = transform; 
      m_destination = destination; 
     } 

     private void TransformFiles() 
     { 
      var xmlTarget = new XmlTransformableDocument(); 
      xmlTarget.PreserveWhitespace = true; 
      xmlTarget.Load(m_source); 
      var xmlTransform = new XmlTransformation(m_transform); 

      if (xmlTransform.Apply(xmlTarget)) 
       xmlTarget.Save(m_destination); 
      else 
      { 
       Console.WriteLine("Unable to apply transform."); 
       Environment.Exit(-1); 
      } 
     } 

     private void CheckPermissions() 
     { 
      string directoryName = m_destination; 
      PermissionSet permissionSet = new PermissionSet(PermissionState.None); 
      FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, directoryName); 
      permissionSet.AddPermission(writePermission); 
      if (!(permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))) 
      { 
       Console.WriteLine("Cannot write to file : " + m_destination); 
       Environment.Exit(-1); 
      } 
     } 

     private void CheckFileExistance() 
     { 
      List<string> ls = new List<string>(); 
      ls.Add(m_source); 
      ls.Add(m_transform); 
      foreach (string item in ls) 
      { 
       if (!File.Exists(item)) 
       { 
        Console.WriteLine("Cannot locate file : " + item); 
        Environment.Exit(-1); 
       } 
      } 
     } 

     public void Run() 
     { 
      CheckFileExistance(); 
      CheckPermissions(); 
      TransformFiles(); 
     } 
    } 
} 
Cuestiones relacionadas