Visual Studio Setup Projesiyle Kurulum Dosyası Hazırlamak

Arkadaşlar merhaba, uzunca bir aradan sonra yeni bir paylaşımda bulunmak istedim. Bu seferki konumuz bir kurulum dosyası hazırlamak. Uzun uğraşlar sonucu, masaüstü uygulamanızı bitirdiniz ve artık teslim etmeniz gerekiyor. Kullanıcıya önce .Net framework indir, sonra sql server kur, sonra program dosyalarını kopyala, vs vs vs şeklinde cümleler kurarsanız, karşınızdaki vatandaş daha ilk dakikadan programdan soğur sanırım. Hele bilgisayar bilgisi fazla değilse tam bir facia. Bunu engellemek için bir kurulum dosyası hazırlarsınız ve kullanıcı sadece bir kaç kez 'ileri' düğmesini tıklayarak programı kurmuş olur. Gelin buradan kurulum dosyası hazırlamaya başlayalım...

Öncelikle kurulum yani setup projesi üzerine bir uzmanlığım olduğu söylenemez. Kendi yazdığım bir projenin kurulum dosyasını oluştururken bişeyler öğrendim ve bunları paylaşmak istedim.
Öncelikle küçük bir demo proje hazırladım. Uygulama oldukça basit; form üzerinde 3 kolondan oluşan ve DevExpress'e ait bir Xtragrid ve grid altında da bir buton var. Butonu grid üzerinde
yapılan değişikleri veritabanına aktarmak için kullandım. Proje basit ama mümkün olduğunca geniş tutmaya çalıştım; demo projesine bağlı bir de veritabanı oluşturdum. Herhangi bir kayıt
defteri(regedit) etkiketi kullanmadım ama kurulum projesinde bu etiketleri de ekledim. Şimdi gelelim kurulum projemizin neler içerdiğine :



* Demo projesinde Sql Express kullandığım için kurulum projesinde de sqlExpress kurma zorunluluğu doğdu. Bu arada ben kurulum projesinden Sql 2008 gibi büyük sürümleri kurmayı hiç denemedim.
Bu konuya ön şartlar kısmını anlatırken tekrar değinelim.


* Projeyi .Net Framework 3.5 ile yazmıştım. Dolayısı ile kurulum projesinde de .Net FrameWork 3.5sp1 var.


* Geniş projelerde kayıt defteri etiketleri kullanılabiliyor. Ben de örnek olması açısından projeye bir kaç etiket yerleştirdim.


* Ben gerek veritabanı işlemlerini, gerek bileşen kütüphanelerini(dll dosyalarını) hep minik scriptlerle(bat dosyalarıyla) yaptım. Belki kolay yolu vardır ancak ben bulamadım. Daha doğrusu
aramadım. Çünkü bir hata olduğunda setup projesine müdahale edemiyorsunuz ama kendi scriptlerinizde arıza çıktığında hemen müdahale edebiliyorsunuz.


* Son olarak da program dosyaları tabi ki.


Şimdi öncelikle benim proje hiyerarşime bir göz atalım :


Adım adım neler yaptığımızı görelim: Önce projeyi yazdık ve bitirdik. Sonra solution'a yeni bir proje ekledik. Eklediğimiz proje :




Görüldüğü üzere yeni bir kurulum projesi oluşturduk. Malum demo projemi .Net FrameWork 3.5 altında yazdığımı belirtmiştim. Bununla birlikte veritabanı da kullandığımı söyledim. Bu
da demektir ki, hazırladığımız demo projenin kurulumu yapılmadan önce kesinlikle kurulum yapılacak bilgisayarda .Net FrameWork 3.5 ve SqlExpress olmalıdır. İşte bu durum önşart olarak,
ingilizce terimiyle 'prerequisites', olarak geçmekte. Bu da bizim kurulum projemizin özellikler kısmından ayarlanabilir bir yapıdır. Kurulum projemize sağ tıklayıp özelliklerine girdikten
sonra karşımıza gelen ekrandan üç farklı işlem gerçekleştirebiliriz :

* "Configuration manager" düğmesine tıklayarak, projelerimizin build edilip edilmeyeceğine karar verebiliriz. Aynı zamanda release mod seçimi de yapabiliriz. Benim durumum şu:


Dikkatinizi çekmek istediğim nokta şu, ben setup projesinden build sekmesindeki onay işaretini kaldırdım. Bunun sebebini çoğunuz biliyorsunuzdur zaten ama söylemekten zarar gelmez.
Diyelim ki kurulum projesini, solution'a dahil ettik. Ancak sonradan asıl projede değişiklikler yapmamız gerekti. Bu bende çok sık oldu. Ordaki onay kutusunu boş bırakmazsanız setup
projeniz de her seferinde tüm projeyle birlikte derlenir ki kurulum projesinin derlenmesi oldukça vakit alıyor. Build sekmesindeki onayı kaldırırsınız bu sorun çözülmüş oluyor.

* Özellikler penceresinden yapabileceğimiz bir diğer işlem projeden çıkacak dosyaya vereceğimiz isim, cab dosyası mı msi dosya mı karar vermek vs.

* Özellikler penceresinden asıl yapacağımız iş ise kurulum önşartları(prerequisites). Özellikler ekranından bu düğmeye tıkladığımıza karşımıza yeni bir pencere açılıyor.
Bu pencereden de kullanıcının bilgisayarında kurulum başlamadan önce olması gerekenleri yani yukarda açıkladığım önşartları seçiyorsunuz. ben sql Express ve .Net framework 3.5 işaretledim:



Burda dikkat edilmesi gereken nokta ön şartları seçtiğimiz listenin hemen altında, bu ön şartların nerden kurulacağını seçmemizi isteyen bir panel var. Ben bu panelden uygulamayla
aynı dizinden seçeneğini seçtim. Yukarda eklediğim resimde bunu görüyorsunuz zaten. Aynı dizini seçmek demek aslında önşartları, örneğin .Net frameWork'ünü, kurulum projesine gömmek
demek oluyor. Böylece kullanıcınızın internet bağlantısı yoksa bile gerekli kurulumları yapabiliyor. burda bir noktaya dikkat çekmek istiyorum.
Nette yazanlara göre ön şart koşulundan .Net framework ve sqlExpress seçtikten sonra projenin klasörünün altına , bu bileşenlerin kurulum dosyalarını koyarsak işlerin yolunda gideceği
yazıyor ama ben bunu bi türlü başaramadım. Bi kişi kurulum dosyasının içine ön şart setuplarını gömmeyi becermiş ama proje kurulumu yaparken önşartlar hiç bi şekilde kontrol edilmemiş.
Bu sorunu benim nasıl çözdüğüme gelelim:

-> Öncelikle .Net Framework offline setup'ı kendi bilgisayarınıza indirmelisiniz. Buradan indirebilirsiniz.
Bu aşamada elinizde winrar olması gerekir. İndirdiğiniz setupa sağ tıklayarak dosyaları buraya çıkar demelisiniz:



Resimde diğer framework sürümleri de görünüyor, bizi ilgilendiren sadece 3.5 sürümü. Çıkan tüm dosyaları
C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\BootStrapper\Packages altına kopyalamalısınız. Bendeki görüntü şu şekilde:





SqlExpress setup'ını da C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\BootStrapper\Packages altına kopyalamalısınız. Bu aşamadan sonra kurulum projenizi
derlerseniz, derleme sonunda kurulum projesine ait debug klasörünün altında bir setup oluştuğunu ve setup'ın içinde frameWork ve sqlServer olduğunu görürsünüz:



Evet, ön şartlar için setupları da projeye gömmüş olduk. Sonraki adımımız hariçten kullandığımız bileşenlere ait kütüphaneleri (dll dosyalarını) setup projemize gömmek. Malumunuz dll
dosyalarını projeyle aynı klasör altında tutmak ve Global Assembly Cache'ye atmak gibi iki farklı alternatifimiz var. Ben GAC'ye attım. Yalnız bu noktada bir sorun var. Visual Studio
hariçten kullandığımız kütüphaneleri bağımlı dosyalar(dependencies) olarak algılıyor. Ancak bu kütüphaneleri kurulum sırasında kendiliğinden GAC'ye atıyor mu bilmiyorum. Bunu sağlayan bir
sistem varsa onu da bilmiyorum. Ben daha önce hazırladığım script dosyama güvenmeyi tercih ettim. Script dosyasından bir kaç minik örnek vermekte fayda var sanırım :






* @Gacutil /i DevExpress.BonusSkins.v8.3.dll /silent
* Gacutil /i DevExpress.Data.v8.3.Compact.dll /silent
* @Gacutil /i DevExpress.Data.v8.3.dll /silent
* @Gacutil /i DevExpress.OfficeSkins.v8.3.dll /silent
* @Gacutil /i DevExpress.Tutorials.v8.3.dll /silent
* @Gacutil /i DevExpress.Utils.v8.3.dll /silent




Bu aşamada sanırım şimdiye kadar neler yaptığımızı bir toparlarsak fena olmaz :

* Öncelikle tabi ki bir projemiz var.
* Projemizde duruma göre, haricen kullandığımız dll dosyaları, sqlExpress gibi bileşenler var.
* Bu bileşenlerden .Net Framework çevrimdışı kurulum paketini internetten indiriyoruz. İndirdiğimiz paketi, winrar gibi bir programla paketi
C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\BootStrapper\Packages altına çıkartıyoruz.


Buraya kadar herşey normal ama visual studio setup projesi scriptleri direk olarak çalıştırmıyordu. Ben de yazdığım scripti küçük bir exe'ye çevirdim. Bunu yapan çok ufak ve ücretsiz
programlar mevcut. Benim kullandığım program buradan indirilebilir. Bu minik program çalıştıracağınız
script'in sessiz(silent) modda yani dos ekranını göstermeden çalışmasını da sağlıyor. küçük exemizi oluşturduktan sonra setup'a dahil etmemiz gerekiyor. Yavaş yavaş asıl kurulumu ifade
eden şeyler oluşmaya başladı. Bu yüzden önce kurulum projesinin yapısını, daha sonra da neyi, nereye, nasıl ekleyeceğimizi anlatmak isterim:



* File System On Target Machine
> Application Folder : Bu klasör bizim için çok önemli. Çünkü içine program dosyaları, iconlar, kısayollar, vs herşey buraya konuluyor. İlerde daha detaylı anlatacağım.
> User's Dekstop : Adından da anlaşılacağı üzere hedef bilgisayarın masaüstüne bu klasörden ulaşabiliyoruz.
> User's Programs Menu : Hedef bilgisayardaki "Başlat -> Programlar" menüsüdür. Bildiğiniz üzere buraya da çeşitli kısayollar ekleniyor.
* Solution Explorer penceresinde gördüğünüz, işaretlediğim noktalar ise şunlar:
> File System Editor : File System On Target Machine dediğim kısım burası zaten.
> Registry Editor : Hedef bilgisayardaki windows registry editörün bir simulasyonunu burda bulabilirsiniz.
> File Types Editor : Açıkçası buna ihtiyacım hiç olmadığı için kullanma ve araştırma gereği de hissetmedim. Bu yüzden yanlış açıklama yapmak istemem.
> User Interface Editor : Kullanıcıyı karşılayan, kurulumu yapacağı yeri vs seçmesine yardımcı olan karşılama ekranı.
> Custom Actions Editor : Az önce hazırlamış olduğumuz küçük exeleri işte bu ekrandan çalıştıracağız. Birazdan daha detaylı anlatacağım.
> Launch Conditions Editor : Ön şart diye bahsettiğimiz şeyleri burda da yapabilirsiniz. Sadece programların değil, programınızın çalışması için gerekli dosyaların olup olmadığını da
buradan kontrol edebilirsiniz. Benim projemde böyle birşeye ihtiyaç yoktu, o yüzden ben burayı da es geçtim.

Temel olarak kurulum yapısı bu şekilde. Artık kurulum dosyalarını projeye atmaya başlayabiliriz. Eklemek istediğimiz dosyaları, klasörleri sürükleyip; Application
Folder
klasörü altına bırakırsak başka bir işlem yapmamıza gerek kalmayacak. Öncelikle yukarda dll dosyaları için hazırladığımız minik exelerimizi kuruluma atalım. Benim exe
olarak hazırladığım program; DevExpress.Dll isimli klasördeki gac.bat isimli minik scripti çağırarak tüm dll dosyalarının GAC'ye atılmasını sağlıyor. Application folder içindeki görüntü
şekilde :



RunGac.exe içinde minik bir script var. O script de DevExpress.DLL klasörü içindeki başka bir scripti çağırıyor. Asıl işi yapan zaten ikinci çağırdığım script. Her zaman olduğu gibi
kodlarımı paylaşacağım için isteyen olursa ayrıntılı bilgiyle birlikte kodlarımı da gönderebilirim. Burada asıl meselemiz RunGac.exe 'nin çalıştırılması. Az önce
belirttim ama tekrar hatırlatmakta fayda var, bu exe kesinlikle öncelikle Application folder altına kopyalanmalıdır. Daha sonra yapacağımız işlem ise, Solution Explorer'dan Custom Actions
Editor penceresini açmaktır. Aşağıdaki görüntü yaptıklarımı ziyadesiyle açıklar sanırım :





Dikkatinizi çektiyse custom actions editörümüz içinde install, commit, rollback ve uninstall gibi seçenekler mevcut. Gerçi ne işe yaradığını anlamışsınızdır ama ben söylemiş olayım: Yukarda
hazırladığımız exe gibi kurulumun çalıştırmasını istediğini komutlar varsa, bu exeleri bu klasörlerden birinin altına koymalısınız. Yükleme esnasında işleminizin çalışmasını istiyorsanız
install klasörünün altına, committen çok emin değilim(yani verdiğimiz komutların ne zaman çalıştırıldığından çok emin değilim), kurulum esnasında hata oluşması durumunda yaptığınız işlemleri
geri almak isterseniz veyaz yaptığınız düzenlemelerin bi kısmını geri almak isterseniz rollback klasörü altına, programınız hedef bilgisayardan kaldırılırken bazı düzenlemeler yapmak ister-
seniz de uninstall klasörünün altına gerekli exeleri koymalısınız.

Buraya kadar bir sorunumuz yoktur umarım. Artık Sql dosyalarımızı kurulum dosyası içine aktarmanın zamanı geldi. Bilgisayarınızda sadece SqlExpress olduğunu
varsayarak anlatmaya başlayalım. C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data klasörü altında SqlExpress 'te açtığımız veritabanı dosyalarını .mdf ve
.ldf olarak görürüz. Ben şahsen bu dosyaları masaüstümde SQLDB diye farklı bir klasöre taşıdım. Çalıştıracağım scriptleri de bu klasöre koydum ve tabi ki bu scriptleri çalıştıracak bir de
exe hazırladım. Şimdi exenin içeriğine bi bakalım :



* @cls
* @SET StartPath=%cd%
* @XCOPY ".\SQLDB\*.*" "%ProgramFiles%\Microsoft SQL Server\MSSQL.1\MSSQL\Data" /y /Q
* @cd %ProgramFiles%\Microsoft SQL Server\MSSQL.1\MSSQL\Data
* @echo 1. sql script calistiriliyor.
* @sqlcmd -E -S .\SQLExpress -i DropBlogSetup.sql
* @echo 2. sql script calistiriliyor.
* @sqlcmd -E -S .\SQLExpress -i AttachBlogSetup.sql
* @echo Veritabani attach ediliyor.
* @SSEUtil -m -a BlogSetup.mdf BlogSetup



Gördüğünüz üzere SqlDb içindeki scriptlerin çağrılmasından başka bir şey yapmıyor bu exe. Şimdi bunu da götürüp Custom Actions Editörümüze ekleyelim. Ancak önce tabi ki Application Folder
klasörüne ekliyoruz. Bendeki son durum şu şekilde:



Evet kurulum dosyamızda dll dosyalarımız ve Sql dosyalarımız gömülü durumda. Sırada program dosyalarını eklemek var. Bunun en basit yolu bence yazdığınız projenin debug klasörünü komple
Application Folder klasörüne sürükleyip bırakmanız. Ancak şu şekilde de yapabilirsiniz :





Resimlerden de gördüğünüz üzere, Solution içinde bulunan herhangi bir projenin oluşturduğu exe ve dll dosylarını Primary Output olarak kurulum projesine dahil edebiliyorsunuz. Bu da ikinci
yöntemdi. Ben sürükleyip bırakmayı tercih ediyorum :)



Projemizin son hali bu oldu. Dilerseniz neler yaptığımızı tekrar sıralayalım :


* .Net Framework'ün hedef bilgisayarda olma koşulu
* .Net Framework 'ün ve internetin olmaması ihtimaline karşı, kurulum projesi içine setup gömmek
* SqlExpress'in hedef bilgisayarda olma koşulu
* SqlExpress'in hedef bilgisayarda olmaması ihtimaline karşı, kurulum projesi içine setup gömmek
* Haricen kullandığımız dll dosyalarının proje içine eklenmesi
* Eklediğimiz dll dosyalarını hedef bilgisayara aktaracak Custom Action işleminin yapılması
* Kullandığımız veritabanının proje içine dahil edilmesi
* Eklediğimiz dll dosyalarını hedef bilgisayara aktaracak Custom Action işleminin yapılması
* Program dosyalarımızın projeye dahil edilmesi



Bu aşamadan sonra bir ihtimal olarak kullanmış olabileceğimiz kayıt defteri etiketlerini hedef bilgisayara işleme durumu var. Aslında bunu da scriptlerle yapabiliriz. Ama visual Studio ol-
dukça kullanışlı bir arayüz koymuş. Dilerseniz kısa da olsa onu anlatayım :



Gördüğünüz üzere hedef bilgisayardaki kayıt defterinin simülatörü diyebileceğimiz bir ekranımız var. İstediğimiz kayıt defteri etiketini burada oluşturabiliriz. Kurulum paketi bizim için
hedef bilgisayarda gerekli yerlerde gerekli kayıtları açacaktır. Yapacağımız şey çok basit; normalde kendi kayıt defterimizde nasıl kayıt açıyorsak, bu ekranda da aynı şekilde kayıt açmak :



Arkadaşlar gördüğünüz üzere kayıt defterimize de gerekli eklemeleri yaptık. Bundan sonra yapacağımız işlem kullanıcı arayüzünü geliştirmek ki orası da artık tamamen size kalmış.
Visual studio değişiklik yapabileceğiniz alanları oldukça kısıtlı tutmuş. Sadece ekrandaki yazıları değiştirebiliyorsunuz. Onların da bir kaç tanesini ancak. Bu kısıtlamadan dolayı
bu kısmı pas geçiyorum çünkü yapılabilecek gerçekten fazla bişey yok ya da varsa da ben bulamadım :)

Son olarak belirtmek istediğim bir kaç özellik var. Programınıza başlık vs atayabileceğiniz bir özellik penceresi var. Burda da ufak tefek değişiklikler yapabilirsiniz :



Bir diğer minik özellik, kısayol eklemek :





Hazırladığınız programın çalışması için masaüstüne, başlat-> programlar klasörüne kısayolları eklemek isterseniz bu yöntemle kolayca yapabilirsiniz. Üst resimde gördüğünüz kısayolu kesip,
User's dekstop klasörüne yapıştırırsanız, kısayolunuz bi anda hazır olur :) Hatta isterseniz bu kısayollara icon da koyabilirsiniz şöyle ki :







Evet sanırım ikonlarımızı da ekleyince programımız hazır duruma geldi. Derleyip bir depolama aracına attığımız zaten setup.exe'yi çalıştırmak bizim için yeterli olacaktır :








Burda maalesef kaynak kod yok ama yine de aklınıza takılan bişey olursa elimden geleni yapmaya çalışırım. İsteyen olursa hazırladığım scriptleri gönderirim. Şimdilik bu kadar. Bi sonraki
yazıda görüşmek üzere, herkese iyi çalışmalar dilerim...

11 yorum:

sevdalinka dedi ki...

Çok başarılı bir anlatım olmuş. Tebrikler.

Adsız dedi ki...

Çok teşekkürler. Lakin express edition'larda projeye setup ekleyemiyoruz doğru mudur?

z.burak güven dedi ki...

Daha önce express edition kullanmadım, ancak bildiğim kadarıyla express edition içinde sadece tek bir programlama diliyle proje geliştirme imkanı veriliyor. Oysa setup projesi başlı başına bir proje. Yani büyük ihtimalle express edition içinde setup projesi yok. İyi çalışmalar dilerim...

Adsız dedi ki...

Çok güzel bir anlatım... İyi çalışmalar

๏ợlєภค dedi ki...

Yer imlerine eklenecek calisma olmus tebrikler...

Adsız dedi ki...

setup projeme veritabanını ekleyemedim şöylebirşey buldum database publishin wizard ile veritabanının scriptini oluşturdum googledan araştırmama rağmen post script yapamadım nasıl yapılyor acaba post script yaptıktan sonra setup projesinin application folder içine mi atacağız?

z.burak güven dedi ki...

Merhabalar, bir mail adresi bırakmamışsınız ama umarım yazdıklarımı görebilirsiniz. Eğer veritabanının scriptini oluşturduysanız, bir batch dosya yardımıyla sql scriptini çalıştırabilirsiniz. Sql scriptlerinin nasıl çalıştırılabileceğini yazı içinde detaylandırmıştım. İyi çalışmalar dilerim...

Unknown dedi ki...

merhabalar. öncelikle verdiğiniz bilgiler için çok teşekkür ederim.
oldukça güzel ve faydalı bir anlatım olduğunu düşünüyorum. databaseleri ekleme metodunu kullanmışşsınız bununla ilgili scriptleri bana gönderirseniz çok sevinirim. teşekkürler.
e-posta: mithatyilmazer@mynet.com

izciogretmenler dedi ki...

merhaba anlatımınız çok güzel. databaseleri ekleme metodunu kullanmışşsınız bununla ilgili scriptleri bana da gönderirseniz çok sevinirim.
bir türlü yapamadım.
teşekkürler şimdiden
hasanhyagmur@gmail.com

Hayati AKBULUT dedi ki...

Hazırlayan arkadaşa ve sitede emeği geçen herkesden Allah razı olsun, çok teşekkür ederim.

murat murathan dedi ki...

merhabalar,
ben de bir proje sonuna geldim. sıra setup aşamasında kullanmış olduğunuz script ve kodları göndermeniz mümkün mü?
kdeneme@hotmail.com