Yapılandırma Dosyası Dönüştürme - Net Framework - (web.config Transformation)

Geliştirdiğimiz uygulamaların bir çoğu, barındırdığı ortama göre farklı ayarları olan yapılandırma dosyalarına sahiptir. Bir uygulama gerek elle gerekse CI/CD araçları ile yayına alınırken, dağıtılıcak ortama göre oluşan yapılandırma dosyası kullanılır.

.NET Core öncesi uygulamalarda yapılandırma ayarları, XML tabanlı web.config veya app.config
dosyalarında tutulur. 

Yapılandırma Dosyalarını Dönüştürmeyi Öğrenmek Ne Kazandırır?

Sunucu üzerinde elle yapılacak bir düzenleme, hataya açık bir işlem olabilir.  Projenin yapılandırma şekline göre yapılacak dönüştürme işlemiyle bu işlem otomatik hale gelir. 

Gerçek hayat projelerinden örnek senaryolarla anlatmak gerekirse;

  • Test ve canlı sunucularında veri tabanı bağlantı bilgileri farklı olmaktadır. 
  • Frontend uygulamanın istek attığı web servis uygulaması, bulunduğu ortamlara göre farklılık göstermektedir. (Test API veya Prod API)
Build/Release süreçleri
Temel build release süreci

.NET Framework projelerinde web.config dosyaları, yapılandırma ayarlarına göre varsayılan olarak Debug ve Release olarak gelmektedir ve ilgili config dosyaları web.config altında yer alır. 

web.config dosyaları


Bu yazıda odaklanılacak konu; bu dosyalara sahip projelerde farklı ortamlara göre yapılandırma dosyalarını oluşturmak, değişikliği kolayca görebilmek ve yönetebilmektir.

XDT Nedir?

XDT - XML Document Transform - yapılandırma dosyalarının yayına alınacağı ortam veya derlenecek yapılandırma ayarlarına göre dönüştürme yapan, XML'de desteklenen bir syntax yapısına sahiptir. xdt ön eki kullanılır.

xdt özellikleri

Temel olarak XDT, Locator ve Transform olarak iki özelliğe (attributes) sahiptir. 

Dönüştürme yaparken kullanılan özelliklerle; yapılandırma dosyasına yeni bir eleman eklenir, var olan elemanın değeri değiştirilir veya eleman kaldırılır.

xdt:Locator

Değiştirmek istenilen yapılandırma ayarını, bu ayarlardaki bir veya daha fazla özelliğin konumunun belirtildiği özelliktir.

Başlıca kullanılan özellikler aşağıdaki gibidir.

Match: Özellik bakımından eşleşen elemanların konumuna bakar.

Aşağıdaki görselde, connection string için dönüştürme işlemi yapılırken, web.<Configuration>.config dosyasında belirttilen name attributesi ile eşleşen bir eleman varsa Transform özelliğinde belirtilen operasyonun yapılmasını sağlar.

Match kullanımı

Condition: XPath ifadesi ile belirtilen koşulu sağlayan elemanların konumuna bakar. 

Aşağıdaki görselde, connection string için dönüştürme işlemi yapılırken, web.<Configuration>.config dosyasında belirttilen @name attributesi Connection olan eleman varsa Transform özelliğinde belirtilen operasyonun yapılmasını sağlar. 

Condition kullanımı

xdt:Transform

Locator'de belirtilen yapılandırma ayarını bulduktan sonra verilen dönüştürme komutuna göre değişikliği gerçekleştirir.

Transform özelliğinde sık kullanılan operasyonlar aşağıdaki gibidir.

Insert: Yapılandırma dosyasına yeni bir eleman eklenir.

web.Release.config

Dönüştürülme işlemi sonucu

InsertIfMissing: Insert işlemi için verilen örnekte, aynı key ile farklı değerden iki eleman eklendi. Eğer ilgili eleman, dosyada yoksa eklenecek; aksi halde eklenmeyecektir. Locator özelliğindeki Hello isimli key ile eşleşen eleman varsa bu işlem uygulanacaktır.

web.Release.config

Dönüştürülme işlemi sonucu

Replace: Config elemanındaki tüm özellikler (attibute) dahil olmak üzere ilgili elemanın tamamının yerini alır.

Örnek senaryoda, connection string için web.Release.config dosyasında connectionString ve name değerini değiştirelim.

Orijinal web.config

web.Release.config

Dönüştürülme işlemi sonucu

Farklı bir senaryoda canlı ortamda birden fazla connection olabilir. Bu durumda connectionStrings taginde Replace işlemi uygulanabilir. Bu işlemle connectionStrings altındaki bütün elemanlar etkilenir ve değişiklik o blokta yansır. web.Release.config dosyasındaki iki connection, web.config dosyasında dönüştürülür.

web.Release.config

Dönüştürülme işlemi sonucu

SetAttribute: Elemanı olduğu gibi bırakır fakat seçilen özelliği değiştirir. Eğer değiştirilecek özellik belirtilmezse elemandaki bütün özelliği değiştirir.

Orijinal web.config

test adındaki key için value özelliğindeki değerde bir değişiklik yapalım.

web.Release.config

Dönüştürülme işlemi sonucu

Remove: İlgili elemanın silinmesine yarar. Bir sonraki görselde, UnobtrusiveJavaScriptEnabled isimli key'e sahip elemanın silinmesi için key özelliği ile eşleşen eleman silinecektir.

web.Release.config

Dönüştürülme işlemi sonucu

RemoveAttributes: Tanımlanan elemandaki en az bir özelliğin silinmesine yarar. compilation elemanındaki debug özelliğinin silinme işlemi yapılacaktır.

Tek bir özelliğin silinmesi

Dönüştürülme işlemi sonucu

RemoveAttributes ile birden fazla eleman silinecekse özelliklerin arasında virgül belirtilmelidir. compilation elemanındaki debug ve targetFramework özelliklerinin silinme işlemi yapılacaktır.

Birden fazla özelliğin silinmesi

Dönüştürülme işlemi sonucu

Dönüştürme İşleminin Kontrol Edilmesi

Üzerinde çalışılan yapılandırma dosyasına sağ tıklanıp "Preview Transform" sekmesine tıklanarak dönüştürülmüş halini gözden geçirilebilir. Böylece yapılandırma dosyasının yayına alındığı sunucudaki temsili hali görülecektir.


Dönüşümün önizlemenin görüldüğü sekmede ikiye bölünmüş olarak web.config'in ilk hali(solda) ve dönüştürülmüş web.config (sağda) dosyasının karşılaştırması görünecektir. Böylece istenen işlemlerin yansıyıp yansımadığı kontrol edilebilir.

Dönüştürülme işlemi sonucu

Özetle; yapılandırma dosyalarını XDT dil kuralındaki Locator ve Transform özellikleri ile dönüştürüp, dağıtılacak ortamlara göre hazır hale getirilebileceğini anlamış olduk. Önizleme yaparak dönüştürmeyi kontrol edebilme şansına sahibiz. 

Yazının faydalı olmasını umarak çalışmalarınızda kolaylıklar diliyorum :)

Microsoft bloglarında daha detaylı kaynaklara erişilebilir.

Yorumlar