Blog di LucaB

audio, video, disco

Gestire diversi file di configurazione (web.config) nello stesso progetto

Ogni volta che lavoro ad un'applicazione web ho il problema di dover modificare alcune righe del file web.config per gestire alcune situazioni ricorrenti.

Di solito, infatti, devo modificare le connection string, impostare il debug a false o a true nella sezione compilation(ma anche la voce debug o i customerrors) a seconda che stia sviluppando il sito dal pc in azienda o dal notebook connesso mediante VPN, oppure che lo debba provare sul server locale, o per pubblicarlo on line.

Il tutto è complicato dal fatto che potrei non essere l'unico a lavorare su quel progetto e che comunque lavoro in un ambiente con source control (Subversion nel mio caso).

In questo post di Scott Guthrie viene spiegata una soluzione molto comoda a questo problema, sfruttando le configurazioni di build della soluzione e del progetto e gli eventi di pre-build. La procedura dettagliata, che è descritta nei particolari in questo post di Scott Hanselman, può essere riassunta nei seguenti passi:

  1. È essenziale che si parta da un progetto di tipo ASP.NET web application, per poter sfruttare gli eventi di pre-build, che non sono disponibili quando si sceglie "Nuovo sito web".image
  2. In configuration manager, accessibile dalla barra degli strumenti standard (vedi figura a lato),  aggiungiamo le nuove configurazioni, oltre a quelle di default (Debug e Release);
    nel creare le nuove configurazioni, bisogna stare attenti a crearle sia per la soluzione che per il progetto; si può partire indifferentemente da uno dei due e mettere una spunta alla richiesta di creare una nuova configurazione anche per l'altro.
  3. Per ciascuna configurazione creiamo un file web.config (magari copiandolo da quello esistente) e chiamiamolo web.config.nomeConfigurazione, ad esempio web.config.debug, ecc.;
    personalizziamo quindi ciascuno dei file a seconda della configurazione, ad esempio cambiandone la connection string.

A questo punto abbiamo impostato diverse configurazioni per la soluzione e per il progetto e per ciascuna di esse abbiamo un diverso file di configurazione web.config

Dobbiamo solo aggiungere un evento di pre-build che si occupi di sovrascrivere automaticamente al file web.config la versione specifica della configurazione impostata.

Per evitare di sovrascrivere comunque il file web.config[1], possiamo utilizzare un file batch che effettui la copia solo nel caso in cui riscontra delle differenze tra il web.config e le impostazioni legate alla configurazione.

Ad esempio, salviamo nella root del progetto un file chiamato copyifdifferent.bat, con le seguenti istruzioni:

@echo off
echo Confronto il file %1 con il file %2

if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound

fc %1 %2
if %ERRORLEVEL%==0 GOTO NoCopy

echo I file sono differenti. Copio %1 su %2.
copy %1 %2 /y & goto END

:NoCopy
echo I file sono uguali. Non effettuo la copia.
goto END

:File1NotFound
echo Il file %1 non esiste. Impossibile effettuare la copia.
goto END

:File2NotFound
echo Il file %2 non esiste. Copio %1.
copy %1 %2 /y
goto END

:END
echo Fine.

A questo punto non resta che impostare un evento di pre-build. Visualizziamo la finestra proprietà del progetto (tasto destro sul progetto e poi proprietà) e in questa scegliamo la scheda "compile" e quindi in basso il tasto "build events".

Nella finestra che compare, scriviamo nello spazio per la command line dell'evento di pre-build:

"$(ProjectDir)copyifdifferent.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config"

Adesso basterà scegliere la configurazione voluta e Visual Studio modificherà, se necessario, il file web.config con le impostazioni specifiche.  

Fonti:


[1] Ogni volta che si modifica il file web.config (e quindi anche se lo si sovrascrive con un file identico), tutti i designer e gli AppDomain avviati che guardano ad esso vengono fatti ripartire.

Technorati Tags: ,

View blog reactions

Posted: Oct 08 2007, 08:55 AM by lucab | with no comments
Filed under: ,