14

Esistono strumenti o estensioni di Visual Studio 2010 che consentono di visualizzare l'output di una trasformazione del file di configurazione senza dover pubblicare l'intero progetto? Il processo che esegue la trasformazione è direttamente invocabile?Strumenti per visualizzare l'anteprima delle trasformazioni dei file di configurazione


Modifica

Dopo un po 'di più Googling mi sono imbattuto this:

Fase 4: Creazione di un nuovo file web.config trasformato per l'ambiente “messa in scena” da riga di comando

Aprire prompt dei comandi di Visual Studio per andando su Start -> Programmi -> Visual Studio v10.0 -> Visual Studio strumenti -> Visual Studio 10.0 Command Prompt

Tipo “MSBuild“Path to Application progetto depositare (.csproj/.vbproj)” /t: /p TransformWebConfig: Configurazione = Allestimento" e cliccare immettere come illustrato di seguito:

commandline web.config transformation

Dopo la trasformazione è riuscita web.config per la configurazione “messa in scena” saranno conservati sotto obj -> Messa in scena la cartella sotto la root del progetto (in Esplora soluzioni è possibile accedere a questa cartella dai primi i file nascosti non-nascosto):

transformed web.config

  • in Esplora soluzioni fare clic sul pulsante per visualizzare i file nascosti
  • Aprire la cartella Obj
  • Accedere alla configurazione di Active (nel nostro cu caso rrent è “messa in scena”)
  • È possibile trovare il web.config trasformato ci

È ora possibile verificare che ha generato la nuova messa in scena file web.config ha mutato sezione di stringa di connessione.

Fonte: Web Deployment: Web.Config Transformation

Questo non è davvero una soluzione perfetta per me in quanto richiede ancora costruendo l'intero progetto- almeno con il comando ha inviato. Se qualcuno conosce il modo di saltare il passo di costruzione con il comando MSBuild che sarebbe utile (anche se suona un po 'improbabile).

Edit 2

Ho trovato anche questo Config Transformation Tool su CodePlex, che offre un buon funzionalità di estendere il processo di trasformazione. Questo strumento è la cosa più vicina che ho visto per la funzionalità che sto cercando e sarebbe un ottimo punto di partenza per lo sviluppo di un'estensione che crea anteprime. Utilizza la libreria Microsoft.Web.Publishing.Tasks per eseguire la trasformazione e non dipende dalla creazione di un progetto reale.

risposta

7

È possibile trasformare un file di configurazione utilizzando gli stessi oggetti utilizzati dall'attività MSBuild, ignorando del tutto MSBuild. La logica di trasformazione Web config è contenuta nella libreria Microsoft.Web.Publishing.Tasks.

Il seguente frammento di codice viene da una semplice libreria di classi, che fa riferimento alla libreria Microsoft.Web.Publishing.Tasks (che viene installato sulla mia macchina in C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10. 0 \ Web).

L'esempio carica un documento di origine e trasforma, applica la trasformazione e scrive i risultati in un nuovo file.

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 po 'di creatività, questa semplice soluzione potrebbe essere integrata in un plug-in di Visual Studio, forse come una voce di menu contestuale del file web.config. Per lo meno, è possibile creare un'utilità di console o uno script per generare anteprime.

Buona fortuna!

+0

questo è essenzialmente un'espansione della mia paragrafo "Edit 2". Mi sento come se ci fosse almeno un po 'bisogno di uno strumento come questo e ho iniziato a mettere insieme i pezzi da solo. Con un po 'di fortuna spero di pubblicare qualcosa sulla Extension Gallery nel prossimo futuro.Grazie per l'input! –

+0

@Nathan: buona fortuna con l'estensione. Non vedo l'ora di vederlo. Lo strumento CodePlex funziona invocando MSBuild. Per uno strumento personalizzato è probabile che tu voglia utilizzare la libreria direttamente come mostrato. Fammi un favore e aggiungi un commento quando hai finito. In bocca al lupo! – kbrimington

+0

Inizialmente ho pensato che funzionasse invocando MSBuild, ma dopo aver consultato la fonte ho capito che sta usando le librerie che hai menzionato sopra. Dal suo aspetto, non dovrebbe essere affatto difficile costruire un prototipo funzionale dell'estensione. –

12

Lo SlowCheetah VS add-in sul visualstudiogallery permette di visualizzare in anteprima i trasformare i risultati

+1

Sì SlowCheetah rende questo in un clic destro così perfetto per questo –

+0

Dopo aver combattuto con una trasformazione per l'ultima mezz'ora ho pensato di utilizzare Google per gli strumenti di trasformazione, è venuto qui, l'ho installato e ha mostrato subito il mio problema. Risolto in 2 minuti. Aggiunto al mio "must-have, come ho fatto senza di esso prima?" kit di strumenti. –

2

Vecchio post, ma pensato che avrei condiviso quello che avevo trovato con una rapida di Google (per coloro che potrebbero non hanno trovato o provato prima qui):

Web.config Transformation Tester - By AppHarbor
è sufficiente incollare il vostro XML originale con il codice XML trasformazione e vedere il risultato istantaneamente.

Inoltre, è open source per chiunque sia interessato.

0

Solo per estendere un po 'questo. Avevo bisogno esattamente di quanto discusso sopra. Per essere in grado di eseguire solo la trasformazione. Quindi collegalo al mio processo di compilazione che nel mio caso è TeamCity.

È necessario utilizzare Microsoft.Web.Publishing.Tasks, che è possibile distruggere con Nuget. Bene, ero in VS2013 così ho potuto. Sono sicuro che potresti acquisire la DLL altrimenti.

Ha scritto una semplice app per console. Potresti trovarlo utile

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(); 
     } 
    } 
} 
Problemi correlati