Right click project, select Properties > Build Events
In the "Pre-build event command line" box, put the following:
if "$(ConfigurationName)" == "Release" start "Version" /D "$(SolutionDir)" /WAIT Version.bat
There are 3 files to make this work, these files need a Solution Folder to reside in:
Right click solution, select Add > New Solution Folder
Now, create these 3 files:
Version.bat - Executed by Visual Studio pre-build event
@powershell -ExecutionPolicy Unrestricted -File "%~dp0Version.ps1"
For more information on the variable %~dp0 click here
Version.txt - Your starting version number
1.0.0.0
Version.ps1 - PowerShell script that is executed by Version.bat which actually increments Version number where needed
param ( [string]$mode = "debug" ) Write-Host "##########################" Write-Host "# Version.ps1" Write-Host "##########################" Write-Host "#" Write-Host "# This script will increment (if chosen) and set the version number in the" Write-Host "# appropriate assembly files throughout the project before compiling continues" Write-Host "#" Write-Host "##########################" Write-Host "" trap { Write-Error $_ exit 1 } ################ # Example Script Usage ################ # @powershell -ExecutionPolicy Unrestricted -File "%~dp0Version.ps1" #################### # Example Method Usage #################### # Set-VersionFile -File $versionFilePath -Version $newVersion # Set-VersionInAssemblyInfo -File ($scriptDirectory + "\ProfitPOS\Properties\AssemblyInfo.cs") -Version $newVersion # Set-VersionInAssemblyInfo -File ($scriptDirectory + "\..\BootstrapperCustom\Properties\AssemblyInfo.cs") -Version $newVersion # Set-VersionInWixGlobal -File ($scriptDirectory + "\..\Setup\Variables.wxi") -Version $newVersion # Set-VersionInAssemblyReference -File ($scriptDirectory + "\MyProduct.Assembly3\App.config") -AssemblyName "MyProduct.Assembly2" -Version $newVersion # Set-VersionInBindingRedirect -File ($scriptDirectory + "\MyProduct.Assembly4\Web.config") -AssemblyName "Other.Component" -Version $otherVersion ########## # Methods ########## function Update-Version ([Version]$Version) { $date = (Get-Date).ToUniversalTime() #$newBuild = $date.ToString("yyMM") #$dayRevisionMin = $date.Day * 1000 #if (($Version.Build -lt $newBuild) -or ($Version.Revision -lt $dayRevisionMin)) { $newRevision = $dayRevisionMin + 1 } else { $newRevision = $Version.Revision + 1 } # This forces new build each time for major upgrades to work, revision is ignored by windows installer $newBuild = $Version.Build + 1 #$newRevision = $date.ToString("HHMMss") / 4 $newRevision = $Version.Revision New-Object -TypeName System.Version -ArgumentList $Version.Major, $Version.Minor, $newBuild, $newRevision } function Get-VersionFile ([String]$File) { #Write-Host ("Reading version file " + $File) #Write-Host "" $versionString = [System.IO.File]::ReadAllText($File).Trim() New-Object -TypeName System.Version -ArgumentList $versionString } function Set-VersionFile ([String]$File, [Version]$Version) { #Write-Host ("Writing version file " + $File) #Write-Host "" [System.IO.File]::WriteAllText($File, $Version.ToString()) } function Set-VersionInAssemblyInfo ([String]$File, [Version]$Version) { Write-Host ("Setting version in assembly info file " + $File) Write-Host "" $contents = [System.IO.File]::ReadAllText($File) $contents = [RegEx]::Replace($contents, "(AssemblyVersion\("")(?:\d+\.\d+\.\d+\.\d+)(""\))", ("`${1}" + $Version.ToString() + "`${2}")) $contents = [RegEx]::Replace($contents, "(AssemblyFileVersion\("")(?:\d+\.\d+\.\d+\.\d+)(""\))", ("`${1}" + $Version.ToString() + "`${2}")) [System.IO.File]::WriteAllText($File, $contents) } function Set-VersionInWixGlobal ([String]$File, [Version]$Version) { Write-Host ("Setting version in WIX global file " + $File) Write-Host "" $contents = [System.IO.File]::ReadAllText($File) $contents = [RegEx]::Replace($contents, "(\<\?define\s*ProductVersion\s*=\s*"")(?:\d+\.\d+\.\d+\.\d+)(""\s*\?\>)", ("`${1}" + $Version.ToString() + "`${2}")) [System.IO.File]::WriteAllText($File, $contents) } function Set-VersionInAssemblyReference ([String]$File, [String]$AssemblyName, [Version]$Version) { Write-Host ("Setting version in assembly references of " + $File) Write-Host "" $contents = [System.IO.File]::ReadAllText($File) $contents = [RegEx]::Replace($contents, "(["">](?:\S+,\s+){0,1}" + $AssemblyName + ",\s+Version=)(?:\d+\.\d+\.\d+\.\d+)([,""<])", ("`${1}" + $Version.ToString() + "`${2}")) [System.IO.File]::WriteAllText($File, $contents) } function Set-VersionInBindingRedirect ([String]$File, [String]$AssemblyName, [Version]$Version) { Write-Host ("Setting version in binding redirects of " + $File) Write-Host "" $contents = [System.IO.File]::ReadAllText($File) $oldVersionMax = New-Object -TypeName "System.Version" -ArgumentList $Version.Major, $Version.Minor, $Version.Build, ($Version.Revision - 1) $pattern = "([\s\S]*?<assemblyIdentity\s+name=""" + $AssemblyName + """[\s\S]+?/>[\s\S]*?<bindingRedirect\s+oldVersion=""\d+\.\d+\.\d+\.\d+-)(?:\d+\.\d+\.\d+\.\d+)(""\s+newVersion="")(?:\d+\.\d+\.\d+\.\d+)(""[\s\S]*?/>)" $contents = [RegEx]::Replace($contents, $pattern, ("`${1}" + $oldVersionMax.ToString() + "`${2}" + $Version.ToString() + "`${3}")) [System.IO.File]::WriteAllText($File, $contents) } ######## # Begin ######## $scriptDirectory = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) $versionFilePath = $scriptDirectory + "\Version.txt" $oldVersion = Get-VersionFile -File $versionFilePath $newVersion = Update-Version -Version $oldVersion Write-Host ("[Enter] for Current Version: " + $oldVersion.ToString()); Write-Host "" Write-Host ("[B] for New Build Version: " + $newVersion.ToString()); Write-Host "" Write-Host "Or enter a Custom Version, example: 1.2.3.4"; Write-Host "" Write-Host "" $mode = Read-Host "Which version do you want to use?" Write-Host "" if ($mode.ToLower().Contains("b")) { Write-Host "" Write-Host ("Using New Build Version: " + $newVersion.ToString()) } elseif ($mode.length -lt 1) { $newVersion = $oldVersion Write-Host "" Write-Host ("Using Current Version: " + $newVersion.ToString()) } else { $modes = $mode.Split(".") $newVersion = New-Object -TypeName System.Version -ArgumentList $modes[0], $modes[1], $modes[2], $modes[3] Write-Host "" Write-Host ("Using Custom Version: " + $newVersion.ToString()) } Write-Host "" Write-Host "" Set-VersionFile -File $versionFilePath -Version $newVersion Set-VersionInAssemblyInfo -File ($scriptDirectory + "\ProfitPOS\Properties\AssemblyInfo.cs") -Version $newVersion Set-VersionInAssemblyInfo -File ($scriptDirectory + "\..\BootstrapperCustom\Properties\AssemblyInfo.cs") -Version $newVersion Set-VersionInWixGlobal -File ($scriptDirectory + "\..\Setup\Variables.wxi") -Version $newVersion Write-Host "" Write-Host "Done!" Write-Host "" Read-Host "Hit enter to exit" exit 0
Updated scripts to allow for prompting of choices.
ReplyDelete