Visual Studio için build events yazdım

Bizim şirkette program versiyonları için tarih kullanıyorlardı. Ama standart program versiyonu şeklinde değil de yazı biçimindeydi. “2018.02.28” gibi  yazıyorlardı. Semantic versiyonlamaya uymuyor ama olsun bu da güzel olabilir dedim ve bu tarih formatını biraz değiştirdim: “1.80.228” gibi. Noktaları yer değiştirip bakarsanız “18.02.28” çıkıyor yani yine aynı tarih formatı geliyor sadece daha gerçekçi oldu. Bu formatı uygulatmak için çok uğraştım. En sonunda da başardım. Ama bir süre sonra her güncellemede elle versiyonu değiştirmek zor gelmeye başladı.

Bir arkadaşım ile birlikte bir command script yazdık. Onu da Visual Studio içinden pre-build event command line kısmından

c:\Pre-Build.bat $(SolutionDir)

yazarak çağırdık. Aşağıda da bu bat dosyasının kodları var. Böylece her build yaptığımda bu script benim programımdaki “Assemblyinfo.cs” dosyalarını arıyor. O dosyadaki içinde version geçmeyen her satırı bir temp dosyaya yazıyor. Sonra güncel versiyonu yazıyor. Eski dosyayı siliyor ve temp dosyanın adını “Assemblyinfo.cs” olarak değiştiriyor. Sonrada scriptin başına bir kontrol ekledim. Eğer dosyanın içinde güncel versiyon yazıyorsa o dosyayı geç diye. Yoksa git dosya içinde bir değişikilk olmasa bile farklı bir dosya olduğunu anlayıp değişiklik var diye ısrar ediyor.

@echo off
setlocal enabledelayedexpansion


if [%1] == [] GOTO :USAGE

chdir /d "%1"

for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set Month=0%Month%
set Day=0%Day%
set Year=%Year:~-3%
set Month=%Month:~-2%
set Day=%Day:~-2%
set today=%Year%%Month%%Day%

set v1=%today:~0,1%
set v2=%today:~1,2%
set v3=%today:~3,3%

set version=%v1%.%v2%.%v3%

for /F "delims=" %%f in ('dir /s /b Assemblyinfo.cs') do (
    echo ^> %%f

    pushd %%~dpf

	>nul find "%version%" AssemblyInfo.cs && (
	  echo "%version%" was found.
	) || (

		for /F "usebackq delims=" %%g in ("AssemblyInfo.cs") do (
			set ln=%%g
			set skip=0

			if "!ln:AssemblyVersion=!" NEQ "!ln!" set skip=1
			if "!ln:AssemblyFileVersion=!" NEQ "!ln!" set skip=1
			if "!ln:AssemblyInformationalVersion=!" NEQ "!ln!" set skip=1
			
			if !skip!==0 echo !ln! >> AssemblyInfo.cs.temp
		)

		echo [assembly: AssemblyVersion^("%version%"^)] >> AssemblyInfo.cs.temp
		echo [assembly: AssemblyFileVersion^("%version%"^)] >> AssemblyInfo.cs.temp
		echo [assembly: AssemblyInformationalVersion^("%version%"^)] >> AssemblyInfo.cs.temp

		move /y AssemblyInfo.cs.tempAssemblyInfo.cs

		popd
	)
)
echo Done^^!

GOTO:EOF

:USAGE
echo Usage:
echo SetVersion.bat ProjectFolderAddress
echo.