Forum: PC-Programmierung Softwareversionierung + SVN


von Michael S. (michael65589)


Lesenswert?

Hallo,

ich habe eine allgemeine Frage zur Versionierung von Software, bzw. zur 
Vorgehensweise.

Ich setzte z.B. Tortoise SVN ein um die Software zu versionienieren, 
jedoch ergeben sich hierbei zwei Probleme.
Zum einen wird die SVN-Revision erst zugewiesen wenn man den Code 
committet und zum Zweiten wird die Revision auch hoch gezählt, wenn man 
aus dem Trunk z.B. einen Tag erstellt.

Meine jetztige Vorgehensweise ist etwas umständlich. Bevor ich den Code 
committe sehe ich im Repro-Browser nach was die letzte Revision ist. 
Dann zähle ich die Revision um eins hoch, trage diese Nummer in meinem 
Sourcecode ein, compiliere und committe anschließend den Code. Somit ist 
die Revision in SVN und meinem Code identisch.

Ich würde lieber die Softwareversion unabhängig von der SVN-Revision 
führen. Das würde aber bedeuten das man eine Cross-Referenz-Liste führt 
aus der der Zusammenhang von Softwareversion und SVN-Revision 
hervorgeht.

Gibt es dafür Tools? Wie macht ihr das?

von Jay (Gast)


Lesenswert?

Michael Stahl schrieb:
> Zum einen wird die SVN-Revision erst zugewiesen wenn man den Code
> committet

Das ist bei solchen Systemen normal.

> und zum Zweiten wird die Revision auch hoch gezählt, wenn man
> aus dem Trunk z.B. einen Tag erstellt.

Das war eine Grundsatzentscheidung der SVN-Entwickler. Die haben 
gesehen, dass auch bei anderen Repositories die internen 
Code-Revisionsnummern und das was man extern als Versionsnummer auf das 
Produkt schreibt nur wenig miteinander zu tun haben.

> Meine jetztige Vorgehensweise ist etwas umständlich. Bevor ich den Code
> committe sehe ich im Repro-Browser nach was die letzte Revision ist.
> Dann zähle ich die Revision um eins hoch, trage diese Nummer in meinem
> Sourcecode ein, compiliere und committe anschließend den Code. Somit ist
> die Revision in SVN und meinem Code identisch.

Das automatische oder manuelle Eintragen von Versionsnummern in Dateien 
ist eigentlich aus der Mode gekommen. Wenn du es noch haben willst, 
Subversion kann das: 
http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html

Aber, zentrales Element in einer modernen Entwicklung ist immer das 
Repository, nicht irgendwo frei rumfliegende Dateien. Frei rumfliegender 
Code zählt nicht, mit dem arbeitet man nicht. Man holt sich Code immer 
aus dem Repository um ihn zu verwenden (editieren, bauen, etc.).

> Ich würde lieber die Softwareversion unabhängig von der SVN-Revision
> führen. Das würde aber bedeuten das man eine Cross-Referenz-Liste führt
> aus der der Zusammenhang von Softwareversion und SVN-Revision
> hervorgeht.

Ja, das ist normal- auch bei anderen Repositories. Die Versionsnummer 
die man extern verwendet ist oft ein Marketing-Tool und hat mit internen 
Code-Revisionen nur wenig zu tun. Die Handhabung der 
MArketing-Versionsnummer beschreibt man in einem separaten 
Release-Prozess. Eine Liste, was genau in eine Release eingegangen ist, 
nennt man BOM (Bill of Material) oder Manifest. So eine Liste verwaltet 
man in der Tat separat als teil des Release-Prozesses.

> Gibt es dafür Tools? Wie macht ihr das?

Es mag Tools geben. Aber ein paar Zeilen Scripting um 
http://svnbook.red-bean.com/de/1.5/svn.ref.svnversion.re.html und andere 
Tools herum tun es auch.

von Jan H. (j_hansen)


Lesenswert?

Michael Stahl schrieb:
> Meine jetztige Vorgehensweise ist etwas umständlich. Bevor ich den Code
> committe sehe ich im Repro-Browser nach was die letzte Revision ist.
> Dann zähle ich die Revision um eins hoch, trage diese Nummer in meinem
> Sourcecode ein, compiliere und committe anschließend den Code. Somit ist
> die Revision in SVN und meinem Code identisch.

Warum tust du das und was bringt es dir?

von Michael S. (michael65589)


Lesenswert?

Die Softwareversion ist in meinem Fall die SVN-Revision. Diese kann auch 
abgefragt werden.
Wenn also ein Kunde mir die "Softwareversion" nennt, weiß ich direkt 
welche Revision er hat und ich kann in den Sourcen nach sehen, bzw. kann 
mit dieser Software testen.

Besser finde ich es wie es Jay (Gast) beschrieben hat. Das das Software 
Repository unabhängig läuft und in einem separaten Tool zu der Version 
dann die Revisionen notiert werden.

von Rangi J. (rangi)


Lesenswert?

ich nutze das ganze unter Windows und habe dazu eine kleine batch:
1
@echo %CD%|findstr /i \tags\ > nul || @goto c1
2
@rem ----- TAG -----
3
@set version=%CD%
4
@set version1=%version:~-5,1%
5
@set version2=%version:~-3,1%
6
@set version3=%version:~-1,1%
7
@goto create
8
9
:c1
10
@rem ---- TRUNK ----
11
@set version1=0
12
@set version2=0
13
@set version3=0
14
15
:create
16
@echo /* %verb%>version.h
17
....

Hier wird festfestellt, ob ich mich im trunk oder tags zweig befinde. je 
nachdem ist die Version 0.0.0 oder 1.2.3. Es wird eine "version.h" 
erstellt, die ich im projekt includiere.
nachteil, die nummer dürfen nur einstellig sein. für kleine private 
zwecke ist das ausreichend.

von MaWin (Gast)


Lesenswert?

Michael Stahl schrieb:
> Ich würde lieber die Softwareversion unabhängig von der SVN-Revision
> führen.

Dafür gibt es den TAG.

Man (checkt aus) trägt (in Resourcen/dem Code) die Versionsnummer ein, 
compiliert (erfolgreich) und testet (erfolgreich) und checkt mit dieser 
Versionsnummer als TAG neu ein, inklusive Kompilate.

Das kann der Build vollautomatisch machen.

War Kompilierung oder Test nicht erfolgreich, hat man keine 
Versionsnummer verbraten, man hat immer Produkte zum Ausliefern in 
lückenloser aufsteigender Versionsnummerierung.

von Michael S. (michael65589)


Lesenswert?

Hallo MaWin,

wenn Du die Version als TAG eincheckst, wird doch auch die Revision hoch 
gezählt.
Ist also nicht gleich der im Code, oder hab ich Dich falsch verstanden?

von Sebastian V. (sebi_s)


Lesenswert?

Die Revision wird auch beim erstellen eines TAGs hochgezählt. Aber wenn 
der Kunde einen Fehler in Version 1.2.3 meldet dann lädst du eben 
nochmal TAG 1.2.3 und kannst dort den Fehler nachvollziehen. Welcher 
Revision des letztendlich entspricht kann dir dann egal sein.

von Stephan (Gast)


Lesenswert?

Schau dir mal das Programm SubWCRev an.
http://tortoisesvn.net/docs/nightly/TortoiseSVN_de/tsvn-subwcrev.html

Damit bauen wir unsere VersionNr auf.
1
#define VERSION_NR_STR    "a.b.c.$WCREV$.$WCMODS?1:0$"

a + b + c sind von uns händisch eingetragene Nr. die mit der Projekt-Nr 
und den Milestones des SW-Projektes übereinstimmen müssen.

Wenn der Code modifiziert ist wird die letzte Stelle eine 'Eins' 
ansonsten eine 'Null'! Hausregel bei uns ist: keine SW mit '.1' am Ende 
verlasst das Gebäude!!!!

aufgerufen wird das bei uns als Pre-Build Step:
SubWCRev . VersionNrStr.tmpl VersionNrStr.h -fe

hier noch einige Beispiele:
http://tortoisesvn.net/docs/nightly/TortoiseSVN_de/tsvn-subwcrev-example.html

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Michael Stahl schrieb:
> Die Softwareversion ist in meinem Fall die SVN-Revision.

Kannst du so machen, aber dann ist eine andere Vorgehensweise 
sinnvoller:

Die Revision wird nicht ins Repo eingecheckt, sondern beim Auschecken 
der Quellen, aus welchen die Software schlussendlich erzeugt wird, wird 
auch SVN-Revision und -Branch abgefragt und in die Software 
eincompiliert.

Dann würde

my-software.exe --version

z.B. ausgeben

"foo version 1.1 SVN branches/test r1234"

Die "1.1" könntest du per Hand pflegen falls gewünscht, d.h. hard 
codiert in Software.  Das "branches/test r1234" entsteht erst beim 
Generieren der Software.  Damit kannst du dann besser nachvollziehen, 
wie deine 1.1 zustande kam — vorsugesetzt die Build-Umgebung ist 
definiert bzw. auch Teil des Projekts.

von Christian R. (supachris)


Lesenswert?

Wir machen das bei uns mit den 4 Feldern der Versionsnummer:

Major.Sprint.Commit.Build

Major wird fest vergeben, Sprint ist die Nummer des aktuellen 
Acrum-Sprints, Commit halt SVN und Build die Nummer des Builds auf dem 
Teamcity Buildserver. Das hat den Vorteil, dass es auch mit dem Windows 
msi Installer conform ist, denn den interessieren nur die ersten 3 
Felder.

von Steffen K. (fanta_sie)


Lesenswert?

Wenn man SVN nich kapiert oder kompliziert findet, liegt das nicht am 
Nutzer. SVN ist einfach nur Mist. h

Nimm GIT. Mach es einfach. Alles andere ist eh totes Wissen.

von operator (Gast)


Lesenswert?

Steffen K. schrieb:
> Nimm GIT. Mach es einfach. Alles andere ist eh totes Wissen.

Wow, da hat jemand aber ein ganz fundiertes Wissen, dass er uns nicht 
mitteilen möchte. Anderst kann ich mir diesen Kommentar nicht erklären.

Besonders die Aussage: "Nimm GIT. Mach es einfach." höhre ich 
seeeeehhhhhr selten und wenn, dann von kleingeistern die sonst nichts 
kennen.
Und wenn es dann doch so einfach wäre, hättest du ihm sicher eine Lösung 
in GIT mit einem Einzeiler präsentieren können, oder etwa nicht?

von Rolf M. (rmagnus)


Lesenswert?

Steffen K. schrieb:
> Wenn man SVN nich kapiert oder kompliziert findet, liegt das nicht am
> Nutzer.

Doch, denn SVN ist einfach zu verstehen.

> Nimm GIT.

Das wollte ich eigentlich mal tun, aber hab auch nach lesen der 
Anleitung nicht kapiert, wie es funktioniert.

von Klaus W. (mfgkw)


Lesenswert?

Steffen K. schrieb:
> Wenn man SVN nich kapiert oder kompliziert findet, liegt das nicht am
> Nutzer. SVN ist einfach nur Mist. h

Ich komme damit gut zurecht. Liegt das dann an mir? Muß ich mir Sorgen 
machen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.