Vom Quellcode oder von der Binärdatei abhängen?

9

Wir haben zwei interne Projekte, A und B, die von verschiedenen Teams entwickelt wurden, wobei B von A abhängig ist. Da der Quellcode für beide Projekte in git gespeichert ist, habe ich Projekt A als Submodul in Projekt B aufgenommen und das Build-System konfiguriert beides in der richtigen Reihenfolge zu bauen. Eine alternative Lösung wäre, A über einen binären Repository-Manager wie Artifactory oder Nexus zu konsumieren.

Ich frage mich über die Vor- und Nachteile von Quellcode und Binärartefakten. Wann ist einer besser als der andere? Bisher habe ich mir folgende Faktoren ausgedacht, aber ich bin sehr gespannt auf andere Meinungen.

Je nach Quellcode ist besser

  • Wenn Sie keinen binären Repository-Manager haben
  • Wenn Sie von der Vorabversion eines anderen Projekts abhängig sein müssen
  • Wenn Sie ein anderes Projekt patchen müssen
  • weil es einfacher ist, den Quellcode von Abhängigkeiten in der IDE zu durchsuchen

Abhängig von Binärdateien ist besser

  • Bauzeit zu minimieren
  • um den Aufwand beim Einrichten der Build-Umgebung eines anderen Projekts zu vermeiden
mkalkov
quelle
1
Nach meiner Erfahrung ist die Möglichkeit, ein anderes Projekt zu patchen, der Schlüssel. Manchmal müssen Patches nicht einmal auf den Master zurückgezogen werden (projektspezifische Erweiterungen / Änderungen). In solchen Fällen müssen Sie ohnehin eine Build-Umgebung für das abhängige Projekt einrichten. Wir verwenden also die Quellcode-Abhängigkeit. Aber natürlich hängt es von Ihren Prozessen / Ihrer Architektur ab.
Proskor

Antworten:

5

Ich würde immer binäre Abhängigkeiten gegenüber Quellabhängigkeiten empfehlen. Die meisten der Profis, die Sie für den Quellcode auflisten, können auch problemlos in binäre Abhängigkeiten integriert werden.

Erstens ist es sehr schnell, ein Nexus-Repo auf einem lokalen Server einzurichten. Die Vorteile eines binären Repos überwiegen bei weitem den Einrichtungsaufwand / die Einrichtungskosten. Dies ist fast eine Voraussetzung für den Rest meiner Antwort :)

Bei Vorabversionen sollten Ihre Projekte -SNAPSHOT-Versionen in der Artifactory bereitstellen. Es kann eine schöne und klare Unterscheidung zwischen Versionen geben, wie zum Beispiel:

  • projectA-3.2.0-SNAPSHOT : Aktive Entwicklung, kann sich jederzeit ändern
  • projectA-3.2.0-RC1 : Kandidat freigeben
  • projectA-3.2.0 : Produktionsfreigabe

Alle diese Versionen können zusammen in Ihrem Artefakt gespeichert werden. Ihre Projekte würden genau wissen, gegen was sie kompilieren.

Für Patches gitist dein Freund. Fork das Repo und geben Sie eine Patch-Versionsnummer ein, wie z projectA-3.2.1-FOR_PROJ_B. Beachten Sie die .1, die eine Patch-Version und auch den Deskriptor zeigt. Dies erleichtert es dem Projekt auch, diese Änderungen später wieder in den Master zu übernehmen.

Für den Quellcode können Sie Ihr Build-Tool so konfigurieren, dass ein "Quell-Jar" generiert und neben dem binären Jar in der Artifactory bereitgestellt wird. Die meisten IDEs können den Namen des Quell-JARs nachschlagen und die Quelle automatisch für Sie herunterladen.

Ein weiterer wichtiger Grund, sich vom Quellcode fernzuhalten, besteht darin, dass Sie an die Abhängigkeiten von Buildsystem, Toolkette und Kompilierungszeit von Projekt A gebunden sind. Wenn in Projekt B ein Buildfehler auftritt, müssen Sie zunächst untersuchen, ob Projekt A oder Projekt B hat einen Fehler verursacht. Wenn es sich um Projekt A handelte, müssen Sie Personen aus diesem Projekt aufspüren, um deren Build zu korrigieren. Dies erhöht den Overhead Ihres Erstellungszyklus erheblich.

metacubed
quelle
Fair genug bis auf den letzten Punkt. Ein Git-Submodul impliziert, dass Sie von einer genauen Version eines anderen Projekts abhängig sind. Da Abhängigkeiten niemals zusammen mit anderen Änderungen aktualisiert werden, ist es immer offensichtlich, ob Änderungen an Projekt A oder an Projekt B Chaos verursacht haben. Danke für deine Antwort!
mkalkov
1

Ich würde mich für eine binäre Abhängigkeit entscheiden, da fast keine Ihrer Überlegungen, die mich begünstigen, ohne Kritik ist:

  • Wenn Sie keinen binären Repository-Manager haben: Das ist in Ordnung, aber ich denke nicht, dass es so schwierig ist, einen zu etablieren. In der einfachsten Ebene ein freigegebener Ordner, in den nur die Verantwortlichen schreiben können, welche Version verwendet wird.

  • Wenn Sie sich auf die Vorabversion eines anderen Projekts verlassen müssen: Metacubed hat es bereits behandelt. Entweder mit Quellcode oder binären Abhängigkeiten sollten Sie sich an eine gut etablierte Version halten, auch wenn es sich um eine Vorabversion handelt. Wenn Sie gegen eine Vorabversion entwickeln, besteht die Wahrscheinlichkeit, dass Sie aufgrund von Fehlerbehebungen häufig zu einer aktualisierten Version wechseln müssen.

  • Wenn Sie ein anderes Projekt patchen müssen: Meinen Sie damit, dass Ihr Team das Projekt patchen wird, das von einem anderen Team im selben Haus erstellt wurde? Ich würde sagen, die vernünftigste Strategie ist es, dem anderen Team die Probleme mitzuteilen, die Sie mit ihrem Projekt haben.

  • weil es einfacher ist, den Quellcode von Abhängigkeiten in IDE zu durchsuchen: Sie sollten nicht in das Innenleben Ihrer Abhängigkeiten eintauchen müssen, da dies Folgendes bedeutet:

    • Projekt A ist schlecht dokumentiert
    • Ihre Codierer verwenden keine "undokumentierten Funktionen" von Projekt A mehr, die bei jedem Update ohne vorherige Warnung verschwinden können.
SJuan76
quelle
1
Patchen von internen Projekten: Nun, es ist ein Planungsproblem. In unserem Fall bedeutet "intern" dieselbe Organisation, aber unterschiedliche Abteilungen und unterschiedliche geografische Standorte. Stellen Sie sich vor, ein Projektentwickler führt eine neue (fehlerhafte) Funktion ein. Wir (Entwickler von Projekt B) planen eine neue Version, die von dieser Funktion abhängt, und entdecken mitten im Prozess einen Fehler darin. Wir haben die Möglichkeit, (a) den Fehler zu patchen, die Veröffentlichung rechtzeitig vorzunehmen und den Patch stromaufwärts zu senden oder (b) einen Fehler stromaufwärts zu melden, zu warten, bis der nächste Sprint behoben ist, und unsere Veröffentlichung einen Sprint später zu machen. Manchmal ist Option b akzeptabel, manchmal nicht.
mkalkov
Ich stöbere auch ziemlich oft im JDK-Quellcode, weil ich dadurch besser programmiere und manchmal sogar erstklassige Dokumentation nicht ausreicht. Dies bedeutet jedoch nicht, dass ich undokumentierte JDK-Funktionen verwende. Die gleiche Logik gilt für den Abhängigkeitsquellcode. Ich stimme jedoch zu, dass dies Raum für Missbrauch lässt. Danke für deine anderen Punkte!
mkalkov
In Bezug auf Ihren ersten Kommentar scheint Ihr System zu einem Szenario zu führen, in dem Team A "Projekt A 2014 v1" startet und Team B "Projekt B 2014 v1" startet, das ein "Projekt A 2014 v1" enthält, das nicht ganz dasselbe ist als Team A gestartet ...
SJuan76
Es ist eher wie "Team A veröffentlicht Projekt A-1.2.3 und Team B veröffentlicht Projekt B-4.5.6, das Projekt A-1.2.3-Patch1 enthält".
mkalkov