Hantera web.config för olika miljöer

Jaha.. så var det den tiden av projektet igen. Jag visste ju att den skulle komma. Den kommer alltid förr eller senare. Ni vet vad jag talar om, ni har säkert råkat ut för det flera gånger själva, det är dags för er service/applikation att ta steget ut till en ny miljö – test, qa eller kanske direkt till produktion. Och då kommer den stora frågan: "Vad gör vi med vår web/app.config?"

Här på MyTravel har vi haft lite olika lösningar på problemet, men det som används mest (tex på våra webbar) är en web.config som innehåller all nödvändig information för samtliga miljöer. Sedan kollar vi i global.asax vilken miljö som är aktuell genom att titta på namnet på servern och host-headern. Det fungerar fint men blir lite mycket kodande och ger dessutom ganska krångliga web.config-filer.

Just nu lutar jag åt en lösning där man på ett eller annat sätt genererar/väljer rätt web.config-fil vid produktionssättningen. Som jag ser det så finns två huvudalternativ där.

En web.config per miljö

Skriv en web.config för varje miljö. Kalla dem tex web.config.test, web.config.prod osv. En batch-fil döper om rätt filen vid produktionssättningen.

Fördelar

Enkelt (och verkar vara ganska beprövat). Ingen extra kod behöver skrivas, batchfilen kan vem som helst förstå vad den gör.

Nackdelar

Varje generell ändring i web.config måste göras i alla web.config-filer. Kan låta som ett ganska litet problem, men när det börjar handla om tio projekt med tre-fyra olika miljöer så blir det rätt mycket att hantera.

En web.config + en fil med skillnader

Skriv en huvud-web.config som fungerar för utvecklingsmiljön. Gör sedan någon form av diff-web.config som innehåller de ändringar som behöver göras för alla andra miljöer. Bygg sen en liten "snurra" (hatar det ordet) som bygger ihop en ny web.config vid produktionssättning.

Fördelar

Lätt(are) att hantera ändringar som måste göras i alla miljöer. Lättare att få överblick över vad som skiljer mellan olika miljöerna

Nackdelar

Krångligare script/program som behöver användas vid produktionssättningen.

Vad tycker ni? Jag lutar lite åt alternativ två, men har någon en ännu bättre lösning? Jag antar att vi annars skulle kunna utnyttja någon tredjepartsprodukt, men jag vet inte om det är så väldigt mycket bättre egentligen?