|
NAnt ile Otomatik Build İşlemi Gerçekleştirme |
|
Gönderiliyor lütfen bekleyin... |
|
|
NAnt, açık kaynak kodlu, build otomasyon aracıdır. Java projeleri için geliştirilmiş olan Antın .NET uyarlamasıdır.
Yazılım ürünlerimizi ortaya çıkarırken pekçok rutin işlem gerçekleştiririz. Build otomasyonu, bu rutin işlemleri tek hamlede herhangi bir kişinin yapabileceği hale getirir.
NAnt olması gerektiği gibi Mono ile de uyumludur. Proje dosyaları Xml tabanlıdır text dosyalardır. Proje dosyalarının uzantısı builddir fakat bu bir zorunluluk değildir.
İlk NAnt Projemiz
Şimdi NAnt projelerini oluştururken kullandığımız üç temel kavram ile NAntı incelemeye başlayalım.
Öncelikle aşağıdaki basit NAnt projesine gözatalım. Proje içerisindeki işlemlerin ne olduğu şuan için önemsiz. Target, Task ve Dependency kavramlarına odaklanın ve ne anlama geldiklerini tahmin etmeye çalışın :
<?xml version="1.0"?>
<project name="Merhaba Dunya" default="test">
<property name="basename" value="MerhabaDunya"/>
<property name="debug" value="true"/>
<!-- TARGET 1 -->
<target name="build">
<!-- TASK 1 -->
<delete failonerror="false">
<fileset>
<include name="${basename}.exe"/>
<include name="${basename}.pdb"/>
</fileset>
</delete>
<!-- TASK 2 -->
<csc target="exe" output="${basename}.exe" debug="${debug}">
<sources>
<include name="${basename}.cs"/>
</sources>
</csc>
</target>
<!-- TARGET 2 -->
<target name="test" depends="build">
<exec program="${basename}.exe" basedir="."/>
</target>
</project>
|
- Görev (Task) : Build projesi içerisindeki her bir aksiyon.
- Hedef (Target) : Görevler topluluğu.
- Bağımlılık (Dependency) : Hedefler arası ilişki.
Gördüğünüz gibi herbir NAnt projesi aslında text tabanlı bir Xml dosyasıdır.
NAnt projeleri bir project ana düğümü altında sıralanan görevlerden (Task) oluşur. Örneklerimde sizlere sınırlı sayıda görevden bahsedebileceğim. Tüm görevleri NAntın yardım dökümanlarında bulabilirsiniz.
delete (anlaşılacağı üzere belirtilen dosyaları silmeye yarar), csc (C# derleyicisi ile kaynak kodu derler) ve exec (belirtilen uygulamayı çalıştırır) birer görevdir (task).
Dikkat edeceğiniz üzere project ana düğümümüz iki adet hedeften oluşuyor ("build" ve "test") ve bu projenin ana hedefi "test" hedefidir.
depends attributeının belirttiği üzere "test" hedefi "build" hedefine bağımlıdır. Yani "build" hedefi başarıyla tamamlanmadığı sürece test hedefi çalıştırılmaz.
Önemli Not : Eğer bu bağımlılığı ortadan kaldırırsak yani depends attributeını silersek sadece "test" hedefi çalıştırılır.
Aslında yukarıdaki 20 satırlık NAnt projesinin yaptığı işlem çok basit :
Öncelikle "MerhabaDunya.exe" ve "MerhabaDunya.pdb" dosyalarını silip
"MerhabaDunya.cs" kaynak kodunu derleyip "MerhabaDunya.exe" çalıştırılabilir dosyasını oluşturuyor.
Daha sonra da bu çalıştırılabilir dosyayı çalıştırıyor.
Biz bu üç işlemi üç satır DOS komutu yazarak gerçekleştirebilirdik. Peki neden kendimizi zorlayıp bu NAnt projesini yazıyoruz ?
Bu soruya cevap verebilmek için yukarıda verdiğim basit örnekten çok daha fazlasını düşünmek lazım. Gerçek hayat projeleri sadece kaynak kodlardan oluşmaz, dolayısıyla hedef ürünün ortaya çıkabilmesi için basit derleme işlemlerinin ötesinde zaman alan ve yaratıcı olmayan işlemler rutin olarak gerçekleştirilir.
Kodlar, SCMden alınır, derlenir, testler çalıştırılır, veritabanı oluşturulur, gerçek ortama taşıma yapılır...
Bu ve bunun gibi birçok işlem NAnt projeleri ile otomatize edilince kodda her değişiklik yapıldığında bu işlemlerin zahmetsizce yapılması sadece bir çift tıklamaya bakar hale gelecektir.
NAnt Projelerini nasıl çalıştırırım ?
Yazdığınız NAnt projelerini en basitinden
NAnt.exe -buildfile:"MerhabaDunya.build"
komutu ile çalıştırabilirsiniz. Ben yazdığım her NAnt projesi için aşağıdakine benzer bir BAT dosyası oluşturup ilgili projenin içerisine ekliyorum.
Not : -t parametresi derleme işleminin .NET Frameworkün hangi versiyonu kullanılarak yapılması gerektiğini belirtiyor.
"E:\Programs\Programming\NAnt\bin\NAnt.exe"
-t:net-1.1
-buildfile:"E:\Works\Nant\NAntDemo\NAntDemo_1\MerhabaDunya.build"
|
Komut satırında NAnt projemiz.
Örnek 1. NAnt ile SQL Servera veritabanı oluşturma
Aşağıdaki NAnt projesinde dışarıdan vereceğimiz T-SQL dosyası öncelikle test sunucusu üzerinde kuruluyor. Eğer bir hata oluşmazsa senaryodaki uygulamamızın çalışacağı sunucuya kuruluyor. Bu projede yararlandığımız osql aracı SQL Server ile iletişim kurabileceğimiz bir komut satırı uygulamasıdır. Parametreleri ile ilgili daha fazla bilgiyi Books Onlinedan yada MSDNden alabilirsiniz.
Yazdığımız projeleri öncelikle bir test sunucusu üzerinde ne kadar doğru olduğunu test etmeden gerçek ortamda (production) denememeye çalışın.
<?xml version="1.0"?>
<project name="NAnt DB Projesi" default="deployDB">
<property name="TestMachine.User" value="sa"/>
<property name="TestMachine.Password" value="sifre"/>
<property name="TestMachine.Machine" value="TEST_MAKINA_ADI"/>
<property name="TestMachine.Database" value="master"/>
<property name="ProductionMachine.User" value="sa"/>
<property name="ProductionMachine.Password" value="sifre"/>
<property name="ProductionMachine.Machine" value="TEST_MAKINA_ADI"/>
<property name="ProductionMachine.Database" value="master"/>
<property name="SQLFile" value="DBScripts\DBScripts.sql"/>
<target name="deployDB">
<call target="deployTestDB" failonerror="true"/>
<call target="deployProductionDB" failonerror="true"/>
</target>
<target name="deployTestDB">
<exec program="osql">
<arg value="-U" /><arg value="${TestMachine.User}" />
<arg value="-P" /><arg value="${TestMachine.Password}" />
<arg value="-S" /><arg value="${TestMachine.Machine}" />
<arg value="-d" /><arg value="${TestMachine.Database}" />
<arg value="-i" /><arg value="${SQLFile}" />
</exec>
</target>
<target name="deployProductionDB">
<exec program="osql">
<arg value="-U" /><arg value="${ProductionMachine.User}" />
<arg value="-P" /><arg value="${ProductionMachine.Password}" />
<arg value="-S" /><arg value="${ProductionMachine.Machine}" />
<arg value="-d" /><arg value="${ProductionMachine.Database}" />
<arg value="-i" /><arg value="${SQLFile}" />
</exec>
</target>
</project>
|
Örnek 2. Build sonuçlarının mail ile gönderilmesi
Aşağıdaki örneğimizde ise NAnt öncelikle bir Sınıf Kütüphanesi (Class Library) projesini derleyip oluşan DLLi web projemiz altına taşıyoruz. Daha sonra web projesini bu DLLe referans vererek derliyoruz.
<?xml version="1.0"?>
<project name="NAnt Web Projesi" default="buildWeb">
<property name="DLLBaseName" value="Library"/>
<property name="WebPath" value="C:\Inetpub\wwwroot\NAntWebProject"/>
<property name="WebBaseName" value="NAntWebProject"/>
<property name="debug" value="true"/>
<target name="deleteDLLs" description="Deletes Temporary DLLs.">
<delete failonerror="false">
<fileset>
<include name="${DLLBaseName}.dll"/>
<include name="${DLLBaseName}.pdb"/>
<include name="${WebPath}\bin\${DLLBaseName}.dll"/>
<include name="${WebPath}\bin\${DLLBaseName}.pdb"/>
</fileset>
</delete>
<echo message="Delete DLLs." />
</target>
<target name="buildDLL" depends="deleteDLLs">
<csc target="library" output="${DLLBaseName}.dll" debug="${debug}">
<sources>
<include name="C:\Inetpub\wwwroot\NAntWebProject\NAntDemoClassLibrary\*.cs"/>
</sources>
</csc>
<echo message="${DLLBaseName}.dll built." />
</target>
<target name="moveDLLs" depends="buildDLL">
<move failonerror="true" todir="${WebPath}\bin">
<fileset>
<include name="${DLLBaseName}.dll"/>
<include name="${DLLBaseName}.pdb"/>
</fileset>
</move>
<echo message="${DLLBaseName}.dll moved to ${WebPath}" />
</target>
<target name="buildWeb" depends="moveDLLs">
<csc target="library" output="${WebPath}\bin\${WebBaseName}.dll" debug="${debug}">
<sources>
<include name="${WebPath}\*.cs"/>
</sources>
<references>
<include name="${WebPath}\bin\${DLLBaseName}.dll"/>
</references>
</csc>
<echo message="Web Project built." />
</target>
</project>
|
Şimdi bu build projesini, aşağıdaki gibi exec görevini kullanarak NAnt ile çalıştırırsak ve build sonuçlarını loglar isek, bu dosyayı build sonucu olarak mail görevini kullanarak projeden sorumlu kişiye gönderebiliriz.
<?xml version="1.0"?>
<project name="Master Build" default="mailBuildResult">
<property name="BaseDir" value="E:\Works\Nant\NAntDemo\NAntDemo_2"/>
<property name="NAntDir" value="E:\Programs\Programming\NAnt\bin"/>
<target name="BuildWebProject">
<exec program="${NAntDir}\NAnt.exe" failonerror="false">
<arg value="-l:${BaseDir}\Results.txt" />
<arg value="-t:net-1.1" />
<arg value="-buildfile:${BaseDir}\WebBuild.build" />
</exec>
</target>
<target name="mailBuildResult" depends="BuildWebProject">
<mail from="buildmaster"
tolist=" [email protected]"
cclist=""
subject="Build Sonuclari"
message="Build Sonuclari"
mailhost="mail.xyz.com">
<attachments>
<include name="${BaseDir}\Results.txt" />
</attachments>
</mail>
</target>
</project>
|
Örnek 3. NAnt build projesine script ekleme
Aşağıdaki örnekte ise NAnt projesi içerisine script görevini kullanarak script eklemeyi ele alıyoruz.
Aşağıda farkedeceğiniz ScriptMain(Project project) metodu sıradan bir metod değil. Bu metod dahil olduğu sınıf için başlangıç noktasıdır (entry point) ve Main() metodu ile aynı işi yapar. Yani ilk çalıştırılacak olan metoddur.
NOT : Scriptlerinizde string içerisinde de olsa Türkçe karakter kullanmamaya dikkat edin. Yada Xml dosyanıza Türkçe encoding ekleyin.
<?xml version="1.0"?>
<project name="NAnt ile Script Denemesi" default="ScriptDeneme">
<target name="ScriptDeneme">
<script language="C#" mainclass="ScriptClass">
<code>
<![CDATA[
class ScriptClass {
public static void ScriptMain(Project project) {
Console.WriteLine("Suan : " + DateTime.Now.ToString());
}
}
]]>
</code>
</script>
</target>
</project>
|
Daha başka neler yapabilirim ?
- <nunit> görevi ile NUnit Frameworkü kullanılarak testler çalıştırılır.
- <ndoc> görevi ile NDoc kullanılarak proje dökümanı oluşturulur..
- <vssget>, <vsscheckin> ve <vsscheckout> görevleri (task) ile Visual Source Safe entegrasyonu sağlayabiliriz.
- <exec> görevi (task) ile istediğiniz uygulamayı çalıştırıp bu uygulamaya parametre geçebilirsiniz.
- Platform bağımlı görevler NAntContrib kütüphanesinden erişilebilir. Örnek : <mkiisdir> - IISte sanal dizin oluşturur.
- NAntContrib ile birlikte indirebileceğiniz SlingShot uygulamasını kullanarak VS.NET solution (*.sln) dosyanızı NAnt Build projesine dönüştürebilirsiniz. Ben denemelerimde hep hata ile karşılaştım. Ama referans kısımlarını elle ekleyerek build dosyalarını elde edebiliyorsunuz.
- NAnt.exenin bulunduğu dizindeki NAnt.exe.config dosyasına property ekleyerek tüm NAnt projelerinin paylaşacağı global özellikler (property)tanımlayabilirsiniz. Ayrıca yine aynı dosya içerisindeki ayarları değiştirerek NAntı dilediğiniz ayarda çalışmasını sağlayabilirsiniz.
Sonuç
Build işleminin otomatize edilmesi, solutiondaki proje sayısı arttıkça daha iyi anlaşılabilecek bir gereksinimdir. .NET araçlarını ve Frameworklerini inceleyeceğimiz serinin ilk bölümünde NAntı incelemeye çalıştık.
NAnt alanında tek araç değil. XMLe dayalı build dosyalarının önemini farkeden Microsoft, Visual Studio 2005 ile birlikte MSBuild adında bir build engine geliştirdi.
Makaledeki örnekleri indirmek için tıklayın.
Serinin bir sonraki bölümünde görüşmek üzere.
Kaynaklar ve Linkler
Makale:
NAnt ile Otomatik Build İşlemi Gerçekleştirme C#, Visual C# ve .NET Mustafa Erhan Ersoy
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|