Versiyonlar genellikle karşımıza update veya error reporting makenizmalarını oluştururken çıkmaktadır. Ne yazıkki Visual Studio’da bu işi otomatik yada belirli kurallar dahilinde otomatik hale getirmek için bir makenizma yok.Bu yazıda bazı Visual Studio Projelerinde versiyonların nerden ayarlandığı, bazı versiyonlama tekniklerini ve versiyonların update için setup projelerinde nasıl kullanılacağı ile ilgili konulara değineceğim. En sonra ise kendi yazdığım, versiyon set etme Visual Studio Macro ‘sunu paylaşacağım.Version ile ilgili bazı bilgiler:
VB Projelerinde Versiyon bilgisi My ProjectAssemblyInfo.vb dosyasında

Assembly: AssemblyVersion(“1.0.0.0”)Assembly: AssemblyFileVersion(“1.0.0.0”)

satırlarında tutulur.CS Projelerinde Versiyon bilgisi PropertiesAssemblyInfo.cs dosyasında

[assembly: AssemblyVersion(“1.0.0.0”)][assembly: AssemblyFileVersion(“1.0.0.0”)]

satırlarında tutulur.Setup Projelerinde Versiyon bilgisi .vdproj dosyasında

“ProductVersion” = “8:1.0.0”

satırında tutulur.Version bilgisi VB CS projelerinde dört setup projelerinde üç kısımdan oluşur. Sırası ile soldan sağa adları şöyle: Major, Minor, Build, RevisionVersiyon bilgisi her ne kadar string olsada rakamdan başka bişey olamaz.Versiyonun Update makenizmasına etkisi:
Setup projelerinizin update’i kendisi halletsin istiyorsak bilmemiz gereken bazı şeyler var.Bunu bir örnek vererek açıklayayım:Diyelimki Foo adında bir çözümünüz (solution) var ve solution içersindeki projeler söyle:* Foo (Solution)** FooLib (Class Library Project)** FooApp (Windows Application Project)** FooSetup (Setup Project)FooApp FooLib’i kullanıyor. FooSetup FooApp’in Setup’ı. Projenizi tamamladınız ve birine gönderdiniz oda yükledi. Birkaç gün sonra bug buldunuz, düzelttiniz ve yeni setup’i yolladınız. Gönderdiğiniz kişinin yeni setup’a çift tıklayarak update’i tamamlamış olmasını bekliyorsunuz.YeniFooSetup yüklü olan setup’in versiyonuna bakacaktır. Sadece yüksek ise yüklemeye devam edecektir. YeniFooSetup devam ederse, FooApp’in versiyonuna bakacaktır, yüksekse devam edip FooApp’i replace edecektir. Sonra FooLib’e bakacaktır, yüksek ise FooLib’i replace edecektir.Benim tavsiyem her setup oluşturduğunuzda bütün projelerinizin versiyonlarını yükseltmek. Ayrıca Setup Projelerinin update’i düzgün yapması için:

“ProductCode” = “8:{C5D62F73-053B-49CD-9097-D25E9B0A8836}””PackageCode” = “8:{CBDA7CF0-FF2B-41A8-B6AD-D0486DC2BA5F}”

Satırlarındaki Guid’lerin değişmesi UpgradeCode Guid’nin değişmemesi lazım. Bunun nedenini bilmiyorum. Anlatacak arkadaş var ise sevinirim.Versiyon’un arttırılması:
Versiyon artırmak basit, rakam atrtırmaktan ibaret. Benim tercih ettiğim yöntem versiyon rakamlarının bir şekilde release tarihini yansıtmasıdır. Bu iki şekilde olabilir.1) Minor ve Build yerine compile tarihini yansıtan rakamlar koymak. Mesela 3.11.1208 — 2011 Aralık 8 gibi.2) Programın doğum tarihinden beri geçen gün sayısını Build’e koymak. Mesela 3.0.345 — doğum tarihi 2010 Ocak 1 ise buna 345 gün ekle. 2010 Aralık 12Tercih ettiğim yöntem 2.si çünkü bana Major ve Minor versiyon atama özgürlüğü sunuyor.AutoVersion Macro’su:
Paylaştığım AutoVersion Macrısunu çalışma şekli şöyle:* Açık olan Solution içersindeki projelerin her biri için.* Proje klasörü içersinde *.applyautoversion isimli dosya arıyor. Yok ise versiyon değiştirmeden çıkıyor.* .applyautoversion dosyasının adı major minor ve doğum tarihini içermeli. Örnek 3_0_20100101.applyautoversion anlamı, major:3 minor:0 ve doğum tarihi 2010 Ocak 1* Doğum tarihinden itibaren geçen günü hesaplıyor. Bu rakam build oluyor.* Proje klasörü içersinde *.currentautoversion dosyasını arıyor. Eğer dosya ismi bu günün versiyonunu yansıtıyorsa versiyon değiştirmeden çıkıyor. Yani versiyon bugün için değiştirildi tekrar değiştirmeye gerek yok. (3_0_345.currentautoversion)* Şartlar sağlanıyorsa gerekli dosyaları edit ederek versiyonu atıyor.Macro’nun Yüklenmesi:
* Visual Studio açıkken Alt+F11 ile Macros IDE ‘yi açıyoruz.* Menuden Project > Add Module tıklıyoruz.* AutoVersion adını veriyoruz.* Module’u içeriğini replace ediyoruz.* Son olarak her build yaptığımızda macromuzun çalışması için EnvironmentEvents modülünün en altına ve içine şu kodları ekliyoruz.Private Sub BuildEvents_OnBuildProjConfigBegin(ByVal Project As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String) Handles BuildEvents.OnBuildProjConfigBeginAutoVersion.AutoVersion(DTE.Solution.Projects.Item(Project))End Sub
Kullanımı:
Versiyonunu otomatik atanmasını istediğimiz proje klasörüne kendimize uygun isimli .applyautoversion uzantılı dosya yerleştiriyoruz. Örnek 3_0_20100101.applyautoversionBöylesi dosya üretmeyi bilmeyen arkadaşlar için adımlar şöyle:* notepad aç* save as, farklı kaydet* başında ve sonunda çift tırnaklı “3_0_20100101.applyautoversion” yazıyoruzNot: Solution klasörüne koymak scripti çalıştırmaz. Solution içersinde 3 proje var ise üçünede koymak lazım. Verdiğim örnekte FooLib, FooApp ve FooSetup klasörlerine ayrı ayrı koymak gerekir. Her projenin major, minor’leri ve doğum tarihleri farklı olabilir.
Not 2: Setup projelerinde versiyon değiştikren sonra reload etmek isteyecektir. Bu bir error değildir. .vdproj dosyası değiştirildiğinden böyle olmalı.
AutoVersion Macrosu:
Imports SystemImports EnvDTEImports EnvDTE80Imports EnvDTE90Imports EnvDTE90aImports EnvDTE100Imports System.DiagnosticsImports System.Collections.GenericImports System.LinqPublic Module AutoVersionPublic Sub AutoVersion(ByVal Project As EnvDTE.Project)Dim TMPFileName As String = String.EmptyDim ProjectFolder As String = String.EmptyDim ProjectFiles As List(Of String) = New List(Of String)Dim ApplyAutoVersion As Boolean = FalseDim CurrentAutoVersion As String = “nothing”Dim AutoVersionStartDate As DateTime = NothingDim MajorAutoVersion As String = String.EmptyDim MinorAutoVersion As String = String.EmptyDim BuildAutoVersion As String = String.EmptyProjectFolder = New System.IO.FileInfo(Project.FullName).Directory.FullNameFor Each fi In New System.IO.DirectoryInfo(ProjectFolder).GetFiles(“*.*”)If fi.Name.EndsWith(“.applyautoversion”) ThenApplyAutoVersion = TrueTMPFileName = fi.NameTMPFileName = TMPFileName.Split(“.”)(0)MajorAutoVersion = TMPFileName.Split(“_”)(0)MinorAutoVersion = TMPFileName.Split(“_”)(1)TMPFileName = TMPFileName.Split(“_”)(2)AutoVersionStartDate = New DateTime(CInt(TMPFileName.Substring(0, 4)), _CInt(TMPFileName.Substring(4, 2)), _CInt(TMPFileName.Substring(6, 2)))BuildAutoVersion = (DateTime.Now – AutoVersionStartDate).Days.ToString(“0”)End IfIf fi.Name.EndsWith(“.currentautoversion”) ThenCurrentAutoVersion = fi.Name.Split(“.”)(0)End IfNextIf Not ApplyAutoVersion ThenExit SubEnd IfIf CurrentAutoVersion = String.Format(“{0}_{1}_{2}”, MajorAutoVersion, MinorAutoVersion, BuildAutoVersion) ThenExit SubEnd IfIf Project.FullName.EndsWith(“.vbproj”) ThenApplyVBProject(ProjectFolder, MajorAutoVersion, MinorAutoVersion, BuildAutoVersion)End IfIf Project.FullName.EndsWith(“.csproj”) ThenApplyCSProject(ProjectFolder, MajorAutoVersion, MinorAutoVersion, BuildAutoVersion)End IfIf Project.FullName.EndsWith(“.vdproj”) ThenApplySetupProject(ProjectFolder, MajorAutoVersion, MinorAutoVersion, BuildAutoVersion)End IfEnd Sub#Region “VBProject”Private Sub ApplyVBProject(ByVal ProjectFolder As String, ByVal MajorVersion As String, ByVal MinorVersion As String, ByVal BuildVersion As String)Dim FileName As String = String.EmptyDim FileStream As System.IO.FileStream = NothingDim StreamWriter As System.IO.StreamWriter = NothingBackupVBProject(ProjectFolder)If Not ChangeVBProject(ProjectFolder, MajorVersion, MinorVersion, BuildVersion) ThenRollbackVBProject(ProjectFolder)For Each fi As System.IO.FileInfo In New System.IO.DirectoryInfo(ProjectFolder).GetFiles(“*.currentautoversion”)System.IO.File.Delete(fi.FullName)NextExit SubEnd IfFor Each fi As System.IO.FileInfo In New System.IO.DirectoryInfo(ProjectFolder).GetFiles(“*.currentautoversion”)System.IO.File.Delete(fi.FullName)NextFileName = System.IO.Path.Combine(ProjectFolder, String.Format(“{0}_{1}_{2}.currentautoversion”, MajorVersion, MinorVersion, BuildVersion))FileStream = New System.IO.FileStream(FileName, IO.FileMode.CreateNew)StreamWriter = New System.IO.StreamWriter(FileStream)StreamWriter.Write(String.Format(“{0}_{1}_{2}.currentautoversion”, MajorVersion, MinorVersion, BuildVersion))StreamWriter.Flush()StreamWriter.Close()FileStream.Close()End SubPrivate Sub BackupVBProject(ByVal ProjectFolder As String)Dim VersionFile As String = String.EmptyDim BackupFile As String = String.EmptyVersionFile = System.IO.Path.Combine(ProjectFolder, “My Project”)VersionFile = System.IO.Path.Combine(VersionFile, “AssemblyInfo.vb”)BackupFile = VersionFile & “.autoversionbackup”If System.IO.File.Exists(BackupFile) ThenSystem.IO.File.Delete(BackupFile)End IfSystem.IO.File.Copy(VersionFile, BackupFile)End SubPrivate Function ChangeVBProject(ByVal ProjectFolder As String, ByVal MajorVersion As String, ByVal MinorVersion As String, ByVal BuildVersion As String) As BooleanDim i As Integer = 0Dim FileName As String = String.EmptyDim FileStream As System.IO.FileStream = NothingDim StreamReader As System.IO.StreamReader = NothingDim StreamWriter As System.IO.StreamWriter = NothingDim FileLines As List(Of String) = New List(Of String)Dim AssemblyVersionLine As String = String.EmptyDim AssemblyFileVersionLine As String = String.EmptyTryFileName = System.IO.Path.Combine(ProjectFolder, “My Project”)FileName = System.IO.Path.Combine(FileName, “AssemblyInfo.vb”)AssemblyVersionLine = String.Format(“ “, MajorVersion, MinorVersion, BuildVersion)AssemblyFileVersionLine = String.Format(“ “, MajorVersion, MinorVersion, BuildVersion)FileStream = New System.IO.FileStream(FileName, IO.FileMode.Open)StreamReader = New System.IO.StreamReader(FileStream)While Not StreamReader.EndOfStreamFileLines.Add(StreamReader.ReadLine)End WhileStreamReader.Close()FileStream.Close()For i = 0 To FileLines.Count – 1If FileLines(i).StartsWith(“