Einzelnen Beitrag anzeigen

worker
(Gast)

n/a Beiträge
 
#1

Versionskontrolle - wie macht man sie richtig?

  Alt 5. Feb 2009, 09:45
Hallo,

auch wenn jetzt etwas mehr Text folgt, so geht es meiner Meinung doch jeden Entwickler etwas an. Lasst Euch von der Textmenge also bitte nicht abschrecken.

Bezugnehmend auf diesen Beitrag möchte ich die Frage in den Raum stellen, wie man korrekte (revisionssichere) Versionskontrolle bei mehreren Projekten durchführt.

Bei einem Projekt dürfte das Ganze keine Schwierigkeit darstellen.
Man hat seine eigenen Sourcen, Fremdkomponenten etc., meinetwegen strukturiert in mehreren Verzeichnissen, und verwaltet diese mit einem x-beliebigen Versionskontrollsystem (VSS, SVN, JVCS ...).
Ist eine Version fertiggestellt, so wird dieser Stand inkl. aller Sourcen (auch der Fremdsourcen, da im gleichen Projekt) festgehalten (gestempelt, markiert).
Bei Bedarf kann so revisionssicher auf alle festgehaltenen Versionen zurückgegriffen werden.

Was ist aber nun, wenn man mehrere Projekte hat, die auf gemeinsam genutzte Sourcen (Abhängigkeiten, Externals) zugreifen, und man Redundanzen vermeiden will?

Beispiel:
Ich habe die Projekte A, B und C.
Alle diese Projekte greifen auf allgemeine Sourcen D zu. Hierin gibt es verschiedene Units, welche Funktionen verschiedener Themengebiete beinhalten, zB. Stringfunktionen, Filefunktionen, Systemfunktionen...

Die Verzeichnisstruktur sieht folgendermaßen aus:

-Projekte
--A
--B
--C
--D

Gehen wir mal von SVN aus, so verfügt jedes der Projekte (auch die allgemeinen Sourcen D sind ein Projekt) über ein eigenes Repository.

Nehmen wir an, die allgemeinen Sourcen seien ersteinmal statisch.
Wir entwickeln unsere Projekte A, B und C und halten einzelne Versionen fest, bspw. von jedem Projekt 1.0.0, 1.1.0 und 1.2.0.
Wichtig ist nun, dass die allgemeinen Sourcen D von den anderen Projekten verwendet, bei der Markierung derer aber nicht berücksichtigt werden, da sie sich ja nicht im gleichen Arbeitsverzeichnis und somit auch nicht im gleichen Repository befinden (Vermeidung von Redundanzen).

Irgendwann sind Anpassungen der allgemeinen Sourcen notwendig, die wir mit der Version 1.3.0 in den Projekten A, B und C umsetzen.

Wir entwickeln weiter und landen irgendwann bei 1.8.0.

Nun meldet ein Kunde einen Fehler in Version 1.2.0, den wir unbedingt in dieser Version (1.2.1) beheben müssen, da der Kunde nicht auf 1.3.0 und höher updaten kann/will.

So, wir rufen nun also unsere Version 1.2.0 ab. Wenn wir diese nun kompilieren, so wird natürlich der aktuelle Stand der allgemeinen Sourcen gezogen und nicht der, der eigentlich zu Version 1.2.0 gehört.

So - hier liegt nun der Casus Knacktus. Wie verwaltet man die allgemeinen Sourcen richtig, um einerseits Redundanzen zu vermeiden, andererseits diese aber irgendwie bei der Markierung referenzierender Projekte zu berücksichtigen?

Möglichkeiten der IDE:
Die IDE des Visual Studios bietet die Möglichkeit, referenzierte Dateien beim Linken in das Projekt zu kopieren.
Diese befinden sich dann eben im gleichen Arbeitsverzeichnis und somit auch im gleichen Repository und werden mit markiert.
Alles lecker also.
Delphi bietet sowas leider nicht.

Möglichgkeiten des VCS:
SVN bietet die Möglichkeit, 'externals' in die Arbeitskopie zu integrieren. Dabei wird beim Abrufen der Sourcen eine Kopie der Externals in das Projektverzeichnis geholt. Nachteile wurden von mjustin in dem o.g. Beitrag erwähnt.
Weiterer Nachteil aus meiner Sicht: die 'externals' lassen sich nur in Form eines Repositories angeben, d.h. es würden sämtliche Dateien des Repositories der allgemeinen Sourcen in das Projektverzeichnis kopiert obwohl evtl. nur eine Davon benötigt wird.

Meine Frage ist nun: wie lässt sich das lösen? Wie macht Ihr das?

Ich würde mich freuen, wenn sich an dieser Diskussion viele Leute beteiligen, da dieses Thema wohl jeden Entwickler etwas angeht.
  Mit Zitat antworten Zitat