Speichern von Bibliotheken von Drittanbietern in der Quellcodeverwaltung


83

Sollten Bibliotheken, auf die sich die Anwendung stützt, in der Quellcodeverwaltung gespeichert werden? Ein Teil von mir sagt, es sollte und ein anderer Teil sagt nein. Es fühlt sich falsch an, eine 20-MB-Bibliothek hinzuzufügen, die die gesamte App in den Schatten stellt, nur weil Sie sich auf einige Funktionen verlassen (wenn auch ziemlich stark). Sollten Sie nur das jar / dll oder vielleicht sogar das verteilte zip / tar des Projekts speichern?

Was machen andere Leute?

Antworten:


27

Es lohnt sich nicht nur, Bibliotheken von Drittanbietern in Ihrem Repository zu haben, sondern es auch so zu gestalten, dass zukünftige Updates der Bibliothek einfach nachverfolgt und zusammengeführt werden können (z. B. Sicherheitskorrekturen usw.). Wenn Sie Subversion verwenden, lohnt es sich , einen geeigneten Lieferantenzweig zu verwenden .

Wenn Sie wissen, dass es ein kalter Tag in der Hölle sein würde, bevor Sie den Code Ihres Drittanbieters ändern, ist (wie @Matt Sheppard sagte) ein externer Code sinnvoll und bietet Ihnen den zusätzlichen Vorteil, dass es sehr einfach wird, auf ihn umzusteigen Die neueste Version der Bibliothek sollte dies wünschenswert machen, falls Sicherheitsupdates oder eine neue Funktion erforderlich sind.

Sie können auch externe Elemente überspringen, wenn Sie Ihre Codebasis aktualisieren. Dies spart bei Bedarf den langen, langsamen Ladevorgang.

@Stu Thompson erwähnt das Speichern von Dokumentation usw. in der Quellcodeverwaltung. In größeren Projekten habe ich unseren gesamten "Kunden" -Ordner in der Quellcodeverwaltung gespeichert, einschließlich Rechnungen / Rechnungen / Sitzungsprotokollen / technischen Spezifikationen usw. Das gesamte Schießspiel. Denken Sie jedoch daran, diese in einem SEPARATEN Repository zu speichern, das Sie anderen zur Verfügung stellen: anderen Entwicklern; der Kunde; Ihre "Browser-Quellansicht" ... Husten ... :)


3
Was ist, wenn die Bibliotheken von Drittanbietern auf jeder Entwicklerarbeitsstation über ein Installationsprogramm lizenziert werden müssen?
Jpierson

+1, aber was wäre mit verteiltem SC wie git oder hg? PS: beste SO-Avatar-Ikone .... je
slf

@slf Zwei Möglichkeiten, um Anbieter in Git in diesem Artikel zu verzweigen: happygiraffe.net/blog/2008/02/07/vendor-branches-in-git
MattCan

48

Speichern Sie alles, was Sie in 10 Jahren zum Erstellen des Projekts benötigen. Ich speichere die gesamte Zip-Distribution jeder Bibliothek, nur für den Fall

Edit for 2017: Diese Antwort ist nicht gut gealtert :-). Wenn Sie immer noch etwas Altes wie Ameise oder Marke verwenden, gilt das oben Gesagte weiterhin. Wenn Sie etwas Moderneres wie Maven oder Graddle (oder Nuget auf .net zum Beispiel) mit Abhängigkeitsverwaltung verwenden, sollten Sie zusätzlich zu Ihrem Versionskontrollserver einen Abhängigkeitsverwaltungsserver ausführen. Solange Sie über gute Backups von beiden verfügen und Ihr Abhängigkeitsverwaltungsserver keine alten Abhängigkeiten löscht, sollten Sie in Ordnung sein. Ein Beispiel für einen Abhängigkeitsverwaltungsserver finden Sie unter anderem in Sonatype Nexus oder JFrog Artifcatory .


18
Umfasst das also beispielsweise Eclipse oder Visual Studio?
Jpierson

2
Nein. Ich weiß nichts über vs, aber ich brauche keine Sonnenfinsternis, um Projekte zu erstellen, nur das richtige JDK. Dies war in letzter Zeit mit einer Hudson / Jenkins- oder einer anderen CI-Lösung viel einfacher durchzusetzen. Jedes Projekt wird automatisch einmal im Monat erstellt, egal wie alt ...
Tony BenBrahim

1
Es bleibt also die Frage, ob Sie das JDK auch im Quellcodeverwaltungs-Repository speichern. Wo ziehst du die Grenze?
Jpierson

5
@jperson, gewohnt. Bei der automatisierten periodischen Erstellung benötige ich das ursprüngliche JDK nicht, solange Tests für das aktuelle JDK erstellt / bestanden werden. Ich ziehe die Grenze bei "Kann das automatisierte Build-System dieses Projekt noch jeden Monat
erstellen?

20

Speichern Sie die Bibliotheken nicht. Sie sind streng genommen nicht Teil Ihres Projekts und nehmen nutzlos Platz in Ihrem Revisionskontrollsystem ein. Verwenden Sie jedoch Maven (oder Ivy for Ant Builds), um zu verfolgen, welche Versionen externer Bibliotheken Ihr Projekt verwendet. Sie sollten einen Spiegel des Repos in Ihrer Organisation ausführen (der gesichert wird), um sicherzustellen, dass Sie immer die Abhängigkeiten unter Ihrer Kontrolle haben. Dies sollte Ihnen das Beste aus beiden Welten geben; externe Gläser außerhalb Ihres Projekts, aber immer noch zuverlässig verfügbar und zentral zugänglich.


In einigen seltenen Anwendungsfällen, in denen Sie SW irgendwo ohne Internetverbindung erstellen müssen, ist das Speichern (dh die lokale Verfügbarkeit nach z. B. "Git-Klon") ein notwendiges Übel. Sie möchten einem Kunden nicht mitteilen, dass ein Tag verloren geht, da Sie die Software nicht "vor Ort" erstellen können.
Radix

18

Wir speichern die Bibliotheken in der Quellcodeverwaltung, weil wir ein Projekt erstellen möchten, indem wir einfach den Quellcode auschecken und das Erstellungsskript ausführen. Wenn Sie nicht in der Lage sind, die neuesten Informationen zu erhalten und in einem Schritt zu erstellen, werden Sie erst später auf Probleme stoßen.


13

Speichern Sie niemals Binärdateien von Drittanbietern in der Quellcodeverwaltung. Quellcodeverwaltungssysteme sind Plattformen, die die gleichzeitige gemeinsame Nutzung von Dateien, die parallele Arbeit, das Zusammenführen von Bemühungen und den Änderungsverlauf unterstützen. Die Quellcodeverwaltung ist keine FTP-Site für Binärdateien. Assemblys von Drittanbietern sind KEIN Quellcode. Sie ändern sich möglicherweise zweimal pro SDLC. Der Wunsch, Ihren Arbeitsbereich sauber zu wischen, alles aus der Quellcodeverwaltung herauszuholen und zu erstellen, bedeutet nicht, dass Assemblys von Drittanbietern in der Quellcodeverwaltung stecken bleiben müssen. Sie können Build-Skripte verwenden, um das Abrufen von Assemblys von Drittanbietern von einem Verteilungsserver zu steuern. Wenn Sie Bedenken haben, zu steuern, welcher Zweig / welche Version Ihrer Anwendung eine bestimmte Komponente eines Drittanbieters verwendet, können Sie dies auch über Build-Skripte steuern. Die Leute haben Maven für Java erwähnt, und Sie können mit MSBuild für .Net etwas Ähnliches tun.


Sag niemals nie - siehe meinen Kommentar oben. Obwohl ich mich über eine bessere Lösung freuen würde.
Radix

Es gibt Organisationen, deren Code vor 20 bis 30 Jahren mit Tonnen von seltsamen Dingen geschrieben wurde, die im Internet nicht mehr verfügbar sind. Ich würde vorschlagen, dass, wenn Sie alten Quellcode erstellen müssen, alles, was nicht leicht verfügbar ist, vorhanden ist. Wer weiß, ob Ihr Maven-Prozess in 20 Jahren funktioniert? Ich bin im wirklichen Leben auf dieses Szenario gestoßen.
AminM

8

Ich speichere sie im Allgemeinen im Repository, aber ich sympathisiere mit Ihrem Wunsch, die Größe niedrig zu halten.

Wenn Sie sie nicht im Repository speichern, müssen sie unbedingt archiviert und versioniert werden, und Ihr Build-System muss wissen, wie Sie sie erhalten. Viele Leute in der Java-Welt scheinen Maven zum automatischen Abrufen von Abhängigkeiten zu verwenden, aber ich habe I nicht verwendet, daher kann ich es nicht wirklich empfehlen.

Eine gute Option könnte darin bestehen, ein separates Repository für Systeme von Drittanbietern zu führen. Wenn Sie Subversion verwenden, können Sie die externe Unterstützung von Subversion verwenden, um die Bibliotheken aus dem anderen Repository automatisch auszuchecken. Andernfalls würde ich vorschlagen, einen internen anonymen FTP-Server (oder einen ähnlichen Server) zu behalten, von dem Ihr Build-System automatisch Anforderungen abrufen kann. Natürlich sollten Sie sicherstellen, dass Sie alle alten Versionen von Bibliotheken behalten und dort alles zusammen mit Ihrem Repository sichern.


Ich mag die Idee eines separaten Repositorys. Behebt das Problem, bei dem Remotebenutzer NUR Zugriff auf die Quellcodeverwaltung haben (dh sie können nicht auf das anonyme FTP zugreifen oder wo immer Sie das Material von Drittanbietern abgelegt haben). Ich gebe zu, dass es irgendwie kaputt ist, riesige, unveränderliche Binärdateien in der Quellcodeverwaltung zu haben, aber dies isoliert sie zumindest zu einem einzigen Repo.
Überdenken Sie den

5

Was ich habe, ist ein Intranet-Maven-ähnliches Repository, in dem alle Bibliotheken von Drittanbietern gespeichert sind (nicht nur die Bibliotheken, sondern auch ihre jeweilige Quelldistribution mit Dokumentation, Javadoc und allem). Der Grund sind folgende:

  1. Warum sollten Dateien, die sich nicht ändern, in einem System gespeichert werden, das speziell für die Verwaltung von Dateien entwickelt wurde, die sich ändern?
  2. es beschleunigt die Kassen dramatisch
  3. Jedes Mal, wenn ich sehe, dass "etwas.jar" unter Quellcodeverwaltung gespeichert ist, frage ich "und welche Version ist das?"

4

Ich habe alles außer JDK und IDE in die Quellcodeverwaltung übernommen.

Tonys Philosophie ist gesund. Vergessen Sie nicht die Skripte zur Datenbankerstellung und zur Aktualisierung der Datenstruktur. Bevor Wikis herauskamen, habe ich unsere Dokumentation sogar in der Quellcodeverwaltung gespeichert.


4

Ich bevorzuge es, Bibliotheken von Drittanbietern in einem Abhängigkeits-Repository ( z. B. Artifactory with Maven ) zu speichern, anstatt sie in Subversion zu belassen.

Da Bibliotheken von Drittanbietern nicht wie Quellcode verwaltet oder versioniert werden, ist es wenig sinnvoll, sie miteinander zu vermischen. Remote-Entwickler wissen auch zu schätzen, dass sie keine großen Bibliotheken über eine langsame WPN-Verbindung herunterladen müssen, wenn sie diese einfacher aus einer beliebigen Anzahl öffentlicher Repositorys herunterladen können.


2

Bei einem früheren Arbeitgeber haben wir alles Notwendige gespeichert, um die Anwendung (en) in der Quellcodeverwaltung zu erstellen. Das Hochfahren einer neuen Build-Maschine war eine Frage der Synchronisierung mit der Quellcodeverwaltung und der Installation der erforderlichen Software.


1
Für mich scheint es eine Grauzone zwischen "notwendiger Software" und "allem, was zum Erstellen der Anwendung erforderlich ist" zu geben. Ist zum Erstellen der Anwendung kein Compiler erforderlich? Außerdem müssen viele SDKs und Bibliotheken von Drittanbietern auf der Entwicklerarbeitsstation installiert werden. Wo ziehen wir die Grenze und wie werden .NET-Bibliotheken von Drittanbietern in der Quellcodeverwaltung gespeichert, wenn erwartet wird, dass sie sich normalerweise im GAC befinden?
Jpierson

1

Speichern Sie Bibliotheken von Drittanbietern in der Quellcodeverwaltung, damit sie verfügbar sind, wenn Sie Ihren Code in einer neuen Entwicklungsumgebung auschecken. Alle "Includes" - oder Build-Befehle, die Sie möglicherweise in Build-Skripten haben, sollten auch auf diese "lokalen" Kopien verweisen.

Neben der Sicherstellung, dass Code oder Bibliotheken von Drittanbietern, von denen Sie abhängig sind, immer für Sie verfügbar sind, sollte dies auch bedeuten, dass Code (fast) bereit ist, auf einem neuen PC oder Benutzerkonto aufzubauen, wenn neue Entwickler dem Team beitreten.


1

Speichern Sie die Bibliotheken! Das Repository sollte zu jedem Zeitpunkt eine Momentaufnahme dessen sein, was zum Erstellen eines Projekts erforderlich ist. Da für das Projekt eine andere Version externer Bibliotheken erforderlich ist, sollten Sie die neueren Versionen dieser Bibliotheken aktualisieren / einchecken. Auf diese Weise erhalten Sie die richtige Version für einen alten Snapshot, wenn Sie eine ältere Version usw. patchen müssen.


1

Persönlich habe ich einen Ordner für Abhängigkeiten als Teil meiner Projekte und speichere dort referenzierte Bibliotheken.

Ich finde, dass dies das Leben einfacher macht, da ich an einer Reihe verschiedener Projekte arbeite, oft mit voneinander abhängigen Teilen, die dieselbe Version einer Bibliothek benötigen, was bedeutet, dass es nicht immer möglich ist, auf die neueste Version einer bestimmten Bibliothek zu aktualisieren.

Wenn alle Abhängigkeiten zur Kompilierungszeit für jedes Projekt verwendet werden, kann ich nach einigen Jahren, wenn sich die Dinge weiterentwickelt haben, immer noch jeden Teil eines Projekts erstellen, ohne mir Sorgen machen zu müssen, dass andere Teile beschädigt werden. Bei einem Upgrade auf eine neue Version einer Bibliothek müssen lediglich die Datei ersetzt und die zugehörigen Komponenten neu erstellt werden. Dies ist bei Bedarf nicht allzu schwierig zu verwalten.

Trotzdem finde ich, dass die meisten Bibliotheken, auf die ich verweise, relativ klein sind und ein paar hundert kb wiegen, selten größer, was es für mich weniger problematisch macht, sie nur in die Quellcodeverwaltung zu stecken.


1

Verwenden Sie Git-Unterprojekte und verweisen Sie entweder auf das Haupt-Git-Repository der Drittanbieter-Bibliothek oder erstellen Sie (falls nicht vorhanden) ein neues Git-Repository für jede erforderliche Bibliothek. Es gibt keinen Grund, warum Sie auf nur ein Git-Repository beschränkt sind, und ich empfehle nicht, das Projekt eines anderen als bloßes Verzeichnis in Ihrem eigenen zu verwenden.


0

Speichern Sie alles, was Sie zum Erstellen des Projekts benötigen, damit Sie es überprüfen und erstellen können, ohne etwas zu tun.

(und als jemand, der die Schmerzen erlebt hat - bitte bewahren Sie eine Kopie von allem auf, was für die Installation der Steuerelemente und die Arbeit auf einer Entwicklungsplattform erforderlich ist. Ich habe einmal ein Projekt erhalten, das erstellt werden konnte - aber ohne Installationsdatei und Registrierungsschlüssel konnten Sie dies nicht Nehmen Sie keine Änderungen am Steuerungslayout eines Drittanbieters vor. Das war ein lustiges Umschreiben.


0

Sie müssen alles speichern, was Sie benötigen, um das Projekt zu erstellen. Darüber hinaus können verschiedene Versionen Ihres Codes unterschiedliche Abhängigkeiten von Drittanbietern aufweisen. Sie möchten Ihren Code zusammen mit den Abhängigkeiten von Drittanbietern in die Wartungsversion verzweigen ...


0

Was ich persönlich getan habe und was mir bisher gefallen hat, ist, Bibliotheken in einem separaten Repository zu speichern und dann mithilfe der Funktion Subversion svn: externals eine Verknüpfung zu jeder Bibliothek herzustellen, die ich in meinen anderen Repositorys benötige. Dies funktioniert gut, da ich versionierte Kopien der meisten unserer Bibliotheken (hauptsächlich verwaltete .NET-Assemblys) in der Quellcodeverwaltung behalten kann, ohne dass sie die Größe unseres Hauptquellcode-Repositorys erhöhen. Wenn die Assemblys auf diese Weise im Repository gespeichert werden, muss der Build-Server sie nicht installieren, um einen Build zu erstellen. Ich werde sagen, dass es ziemlich mühsam war, einen Build erfolgreich zu machen, ohne dass Visual Studio installiert wurde, aber jetzt, da wir ihn zum Laufen gebracht haben, sind wir damit zufrieden.

Beachten Sie, dass wir derzeit nicht viele kommerzielle Steuerungssuiten von Drittanbietern oder ähnliches verwenden, sodass wir nicht auf Lizenzprobleme stoßen, bei denen möglicherweise ein SDK auf dem Build-Server installiert werden muss, aber ich kann sehen, wo das liegt könnte leicht zu einem Problem werden. Leider habe ich keine Lösung dafür und werde sie ansprechen, wenn ich zum ersten Mal darauf stoße.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.