Wie würde man mit externen Abhängigkeiten in einem Open-Source-Projekt umgehen?


23

Wenn man ein Open-Source-Projekt schreibt und Google Code oder GitHub verwendet und eine Bibliothek wie Lua verwenden möchte, wie soll man das tun?

  • Soll die Abhängigkeit in das Repository aufgenommen werden?
  • Soll die Abhängigkeit aus demselben Erstellungsskript wie der Rest des Projekts oder aus einem separaten Erstellungsskript erstellt werden?

Da die Bibliothek vor dem Kompilieren nicht installiert werden muss.

Antworten:


10

Ich würde wärmstens empfehlen, die Dokumentation von Git zu Submodulen durchzulesen . Es behebt genau dieses Problem, vorausgesetzt, dass alle Ihre Quellen Git verwenden. Wenn dies nicht der Fall ist, können Sie zum Zwecke der Integration immer ein Git-Repo einrichten. Der Aufwand ist trivial und die Auszahlung ist signifikant.


1
Submodules ist eine eher schwache Implementierung von Dependency-Management in Common und in Git. Zumindest Git-Teilbaum ist viel besser Iteration
Lazy Badger

4
-1 Bitte geben Sie in Ihrer Antwort die Details des Links an. Andernfalls ist die Antwort unbrauchbar, wenn der Link verschwindet - wie es jetzt der Fall ist. Leider habe ich noch nicht den Repräsentanten, der abstimmt
Precastic 20.10.14

@Precastic: Wenn Sie den Linktext googeln, gelangen Sie direkt zur neuen Seite. Ich bin mir nicht sicher, wie viel informativer das sein kann.
Bryan Agee

1
Bitte lesen Sie stackoverflow.com/help/how-to-answer - insbesondere den Abschnitt mit dem Titel "Kontext für Links bereitstellen " (Zitat: " Zitieren Sie immer den relevantesten Teil eines wichtigen Links, falls die Zielsite nicht erreichbar ist oder permanent offline ist . ")
Precastic

17

Soll die Abhängigkeit in das Repository aufgenommen werden?

Ich denke, Abhängigkeiten sollten immer in das Repository aufgenommen werden, solange das Einbeziehen von Abhängigkeiten nicht gegen Nutzungsbedingungen verstößt. Wenige Dinge sind ärgerlicher, als die richtigen Versionen der richtigen Abhängigkeiten manuell zu finden, bevor Sie einen Build erstellen können. Sicher, dies ist einfach, wenn Sie über automatisierte Tools verfügen, mit denen Sie die richtige Abhängigkeit finden und herunterladen können. Was ist jedoch, wenn Sie zur Zeit nicht mit dem Web verbunden sind oder der Server ausfällt oder das Projekt der Abhängigkeit wurde komplett eingestellt und offline geschaltet? Beziehen Sie, wenn möglich, immer die Abhängigkeiten ein.

Soll die Abhängigkeit aus demselben Erstellungsskript wie der Rest des Projekts oder aus einem separaten Erstellungsskript erstellt werden?

Verwenden Sie vorkompilierte Versionen, es sei denn, es gibt einen guten Grund, aus dem Quellcode zu kompilieren.

Und warum nicht Optionen im Build-Skript bereitstellen? Ein einfacher Schalter, um auszuwählen, ob die Abhängigkeiten auch kompiliert werden sollen oder nicht. Wenn der Benutzer auch die Abhängigkeiten kompilieren möchte, rufen Sie einfach seine eigenen Erstellungsskripte aus dem Erstellungsskript Ihres Produkts auf. Auf diese Weise kann der Benutzer die Erstellungsskripte der Abhängigkeiten manuell aufrufen oder einen vollständigen Build von allem erstellen. Aber ich würde die Abhängigkeiten nur als Binärdateien liefern, wenn es keinen guten Grund gibt, sie aus den Quellen zu kompilieren. Ich denke, in der Open Source-Welt erfordern einige Lizenzen, dass Sie die Quellen zusammen mit Ihrem Produkt vertreiben, aber das bedeutet nicht, dass Sie sie nicht vorkompilieren können.

Kurz gesagt: Stellen Sie, wenn möglich, ein vollständiges, eigenständiges Arbeitspaket bereit. Dies bietet Ihren Benutzern den größtmöglichen Komfort.


1
@tdammers: Ich weiß, wenn Sie Software auf einem Linux-System installieren, erledigt der Paketmanager die ganze Arbeit für Sie. Das setzt aber eine Internetverbindung voraus und das Paket muss in einem bestimmten Format vorliegen. Ich habe ausdrücklich darauf hingewiesen, dass Automatisierungstools dabei helfen können. Sie können ein solches System beispielsweise nicht für .NET Open Source-Tools verwenden. Wenn Sie sich SourceForge-Tools wie NHibernate oder Castle Windsor ansehen, werden Sie feststellen, dass alle Abhängigkeiten als Binärdateien enthalten sind. Und das ist das einzig Vernünftige.
Falcon

1
@tdammers: Ich muss hier heute übrigens das OpenOffice SDK auf einem Linux-Rechner installieren. Da das SDK nicht über den Paketmanager installiert werden kann, habe ich das RPM von der Website abgerufen. Was ist Ihrer Meinung nach die erste Meldung, die ich erhalte, wenn ich versuche, "rpm --install" auszuführen? Fehler: Fehlgeschlagene Abhängigkeiten: ooobasis3.3-core01 wird von ooobasis3.3-sdk-3.3.0-9567.x86_64 benötigt - OH JOY!
Falcon

2
@tdammers: Sie haben Recht, aber in dem Fall würde ich diese Redundanz gerne haben, wenn nur die Einrichtung und Installation einfach wäre. Und wenn Sie eine Abhängigkeitshölle sehen wollen, schauen Sie sich ein / usr / lib-Verzeichnis an. Es gibt alles: Redundanz, Subversionen und Sie wissen nicht einmal, welches Programm welche Bibliotheken verwendet. Sicher, lassen Sie den Paketmanager damit umgehen! Aber was ist, wenn der Paketmanager nicht so damit umgehen kann wie in dem von mir erwähnten Open-Office-Fall? Das bedeutet im Grunde, dass Sie geschraubt sind und es Ihnen schwer fällt, etwas zu installieren.
Falcon

2
@tdammers: Und je mehr ich darüber nachdenke und meine Erfahrungen: Ich kann nicht einmal zählen, wie oft ich Symlinks in diesem Verzeichnis erstellen musste, nur weil Abhängigkeiten fehlgeschlagen sind oder ein Programm sich weigerte, ausgeführt zu werden, selbst wenn es über einen Paketmanager installiert wurde. Vielleicht ist die Situation jetzt besser geworden, aber es ist oft immer noch harte Arbeit, einige Dinge zum Laufen zu bringen. Probleme, die hätten vermieden werden können, wenn sie nur die Abhängigkeit mit der Anwendung geliefert hätten. Ich bezahle gerne die wenigen MB zusätzlichen Speicherplatz, um diesen Ärger zu vermeiden.
Falcon

2
@tdammers: Die unzähligen Tutorials im Internet zur Installation eines bestimmten Programms auf einem bestimmten Linux-System sind Zeugen dieses Problems.
Falcon

3

Dies kann auf Ihren Anwendungsfall zutreffen oder auch nicht. Bei unserer Arbeit legen wir jedoch in jedem Zweig einen Ordner "Referenzen" an. Hier platzieren wir DLLs von Drittanbietern. Dies verursacht eine Menge Duplikate von relativ unveränderlichen Binärdateien in der Quellcodeverwaltung, aber der Speicher ist billig und zu jedem Zeitpunkt weist jeder Zweig und jedes Tag genau die Abhängigkeiten (und Versionen!) Auf, die er erwartet.

Wir kompilieren die Abhängigkeiten selbst und verschieben die kompilierten Binärdateien in diesen Ordner. Auch unsere hauseigene Shared Library wird so behandelt. Auf diese Weise funktioniert die gleiche Technik für vorkompilierte proprietäre Bibliotheken, Open Source-Bibliotheken und interne Bibliotheken.


Wenn Sie Ihre Frage jetzt beantworten, nachdem ich sie noch einmal gelesen habe, tun Sie dasselbe und erwähnen Sie nur, dass Ihr Projekt eine vorkompilierte 1.3.5-Version von Lua verwendet.


1

Soll die Abhängigkeit in das Repository aufgenommen werden?

Es kann im Repository referenziert werden (mit jeder für SCM verwendbaren Methode), wenn diese Abhängigkeit integraler Bestandteil des Produkts ist (Quellabhängigkeit), nicht die Binärabhängigkeit, die separat aufgelöst werden kann

Soll die Abhängigkeit aus demselben Erstellungsskript wie der Rest des Projekts oder aus einem separaten Erstellungsskript erstellt werden?

Egal. Sie können jede Methode Ihren Anforderungen entsprechend bevorzugen (Geschwindigkeit / Transparenz / Verwaltbarkeit / usw.)


0

Als Eclipse-Shop haben wir gerade damit begonnen, Buckminster für die Verwaltung unseres Erstellungs-, Zusammenstellungs- und Bereitstellungsprozesses zu verwenden.

Unsere erste Phase bestand darin, alle vorhandenen abhängigen Bibliotheken zu extrahieren und Buckminster für das Materialisieren der richtigen zu sorgen. Dies ermöglicht eine viel schnellere und kleinere Bereitstellung.

Der nächste Schritt besteht darin, unser monolithisches svnRepository auf eine Reihe modularer gitRepositorys zu verschieben.

Ich weiß nicht, wie gut Buckminster sich in gitSubmodule (oder quecksilberhaltige Subrepos) integrieren lässt, aber es ist schön, dass Buckminster in Bezug auf das für eine bestimmte Komponente verwendete VCS agnostisch ist.

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.