NicolTIP#017: How to automate the build process (of WP7 apps and more:) with powershell
I developed for fun a couple a WP7 apps and I needed to automate (just a little bit:-) the release process, mainly because:
- The application version must be entered in various point and should be keep in sync
- I’d like to store all released version in a specific directory
The easiest way I found to do this is via PowerShell. I wrote a super simple script that:
- store into a variable the version you want to assign to the build
- replace the version in all location needed for the project.
- In my project, that is of just 1 dll, I had to keep in sync the following files:
- Properties\AssemblyInfo.cs
- Properties\WMAppManifest.xml
- Model\ApplicationInfo.cs (this is a custom c# class…)
- In my project, that is of just 1 dll, I had to keep in sync the following files:
- Rebuild the solution as “release”
- Copy the .xap file into Releases Folder, renaming it adding the version to the file
The directory structure I used (in my project – LED) is the following
- LED (solution folder)
- Releases
- NicolD.Phone.App.LED-1.0.0.1.xap
- NicolD.Phone.App.LED-1.0.0.2.xap
- …
- NicolD.Phone.App.LED (project folder)
- bin
- …
- …
- bin
- LED.sln
- Build.ps1 (the file below)
- Releases
I think that this approach can be used/extended in many other scenarios similar to this one.
Good luck
$version = "1.02.00.00"
$SolutionPath = "D:\MyProjects2010\WP7\PRO\LED\"
$Solution = $SolutionPath + "LED.sln"
$SolutionBin = $SolutionPath + "NicolD.Phone.App.LED\Bin\"
$LogFile = $SolutionBin + "Build.log"
$VStudio2010= "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe"
$releases = $SolutionPath + "Releases\"
$build = $SolutionBin + "Release\NicolD.Phone.App.LED.xap"
$buildArchive = $releases + "NicolD.Phone.App.LED-" + $version + ".xap"
function replace
{
$o = $args[0]
$a = $args[1]
$b = $args[2]
(Get-Content $o) |
Foreach-Object {$_ -replace $a, $b} |
Set-Content $o
}
$AssemblyInfo = $SolutionPath + "NicolD.Phone.App.LED\Properties\AssemblyInfo.cs"
$filter = 'AssemblyVersion\("\d+.\d+.\d+.\d+"\)'
$newstring = 'AssemblyVersion("' + $version + '")'
replace $AssemblyInfo $filter $newstring
$filter = 'AssemblyFileVersion\("\d+.\d+.\d+.\d+"\)'
$newstring = 'AssemblyFileVersion("' + $version + '")'
replace $AssemblyInfo $filter $newstring
$manifest = $SolutionPath + "NicolD.Phone.App.LED\Properties\WMAppManifest.xml"
$filter = 'Version="\d+.\d+.\d+.\d+"'
$newstring = 'Version="' + $version + '"'
replace $manifest $filter $newstring
$appinfo = $SolutionPath + "NicolD.Phone.App.LED\Model\ApplicationInfo.cs"
$filter = 'ApplicationVersion = "\d+.\d+.\d+.\d+"'
$newstring = 'ApplicationVersion = "' + $version + '"'
replace $appinfo $filter $newstring
& $VStudio2010 $Solution /clean | Out-Null
& $VStudio2010 $Solution /rebuild release /out $logfile | Out-Null
copy $build $buildarchive