Artikel tagged ‘SVN

0

SVN-Revision als Build-Version in XCode 4

Folgendes Problem: Applikationen, die mit XCode gebaut werden, haben neben der normalen Release-Version (CFBundleShortVersionString) auch eine sogenannte Build-Version (CFBundleVersion). Die Release-Version ist dabei soweit kein Problem, kann man sie doch nach Belieben manuell hochsetzen. Bei der Build-Version verhält es sich ein bischen anders. Theoretisch möchte man hier, dass diese bei jedem Build automatisch erhöht bzw. auf einen sinnvollen Wert gesetzt wird. Idealerweise kann man aufgrund der Build-Version dann auch auf den verwendeten Code-Stand schliessen.

Ich habe mich daher entschieden, für meine Projekte die SVN-Revision als Build-Version zu verwenden. Dies ist mit XCode (zumindest in der Version 4.2, die ich momentan verwende) durch Hinzufügen einer weiteren Build-Phase ohne weiteres möglich. Hier also das Ergebnis dessen, was ich mir zusammengegoogelt habe:

In den Projekteinstellungen unter “TARGETS/Build Phases” muss man eine weitere (Run Script) Phase an das Ende hinzufügen. Als Script-Sprache habe ich Python gewählt, daher wird unter Shell “/usr/bin/python” eingestellt. Hier nun das Script, dass in der Phase ausgeführt werden muss:

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
import csv
from subprocess import Popen, PIPE
from Foundation import NSMutableDictionary

cmd = "/usr/bin/svnversion" # get the svn revision
svn_revision = Popen(cmd, shell=True, stdout=PIPE).stdout.read()
info_plist = os.environ['BUILT_PRODUCTS_DIR'] + "/" + os.environ['WRAPPER_NAME'] + "/Info.plist"

## Open the plist and write the svn revision as the bundle version
plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_plist)
plist['CFBundleVersion'] = svn_revision
plist.writeToFile_atomically_(info_plist, 1)

Zunächst wird also mittels “svnrevision” die aktuelle SVN-Revision ermittelt. Das aktuelle Verzeichnis zur Ausführung des Scripts ist dabei das Projektwurzelverzeichnis, daher bekommt man auch automatisch die korrekte Revision. Im zweiten Schritt wird dann das “Info.plist” file (welches die Meta-Informationen für das Executable enthält) geändert und der “CFBundleVersion” key gesetzt. Im Ergebnis hat man nach jedem Build wie gewünscht die SVN-Revision als Build-Version.

Im Prinzip also alles ganz einfach. Da ich aber trotzdem ne Weile gebraucht habe, um alle nötigen Schnipsel zusammenzusuchen, hab ich das hier mal zusammengefasst. Vielleicht hilfts ja dem einen oder anderen… :)

Tags : , ,