Wir haben svn:externals
seit einigen Jahren in der Praxis auf geteilten Code angewendet. Wir hatten einige interessante Probleme damit, die Sie wahrscheinlich in Betracht ziehen sollten, bevor Sie es benutzen. Hier ist die Struktur, die wir haben:
%Vor%
Die Verzeichnisse common
in include
und src
in einem Projekt enthalten externe Definitionen, die die allgemeinen Bibliotheken abrufen:
%Vor%
Das Problem, auf das wir gestoßen sind, ist vielschichtig, bezieht sich aber auf die Markierung und Verzweigung unserer Quelle, wenn sich die Projekte im Laufe der Zeit ändern. Die externe Definition, die ich oben gezeigt habe, hat ein paar ziemlich schwerwiegende Probleme, wenn man reproduzierbare Builds haben will:
- Es bezieht sich auf ein dynamisches Ziel -
trunk
.
- Es bezieht sich nicht auf eine explizite Revision.
Wenn Sie mit svn copy
verzweigen, werden die externen Daten wortwörtlich kopiert, da es sich nur um Eigenschaften handelt, die an das Objekt angehängt sind. Einige der anderen svn-Befehle ( commit
, checkout
und export
) interpretieren die Eigenschaften tatsächlich. Wenn Sie ein Projekt markieren, möchten Sie den Status des Projekts wirklich für alle Zeit beibehalten. Dies bedeutet, dass Sie die externen Elemente an eine bestimmte Revision "anheften" müssen, sodass Sie die externe Definition so ändern müssen, dass sie explizit auf die gewünschte Revision verweist (z. B. "lib1 -r42 http://.../common/lib1/trunk/src"
). Dies löst eine Facette des Problems.
Wenn Sie mehrere inkompatible Zweige des gemeinsamen Codes pflegen müssen, müssen Sie angeben, welche Verzweigung explizit (möglicherweise) mit der Revision verknüpft werden soll.
Unnötig zu sagen, das kann ein bisschen Kopfschmerzen sein. Glücklicherweise schreibt jemand in Subversion-Land das Skript svncopy.pl
, das einiges von diesem Chaos automatisiert. Wir haben (und hatten) immer noch mit einigen der Schwierigkeiten zu kämpfen, die dies in einem im Feld eingesetzten Produkt mit einer Menge gemeinsamen Codes und einem Mandat von drei verschiedenen Versionen im Feld zu jeder Zeit unterstützen.
Wenn Sie diesen Weg einschlagen, sollten Sie sich überlegen, wie Sie die Verknüpfungen beibehalten, wenn die Projekte wachsen und sich verändern. Wir haben festgestellt, dass ein bisschen Zeit, über einen Prozess nachzudenken, hier einen langen Weg zurücklegen wird.