Wie verwalte ich Abhängigkeiten für C / C ++ - Projekte richtig?

11

Ich habe ein Projekt, das 3-4 verschiedene Open Source C / C ++ - Bibliotheken verwendet.

Ich habe diese Bibliotheken für mehrere Plattformen erstellt und Include-Dateien und statische Bibliotheken für verschiedene Plattformen in meinem Projekt eingecheckt.

Ich habe jedoch mit einigen Problemen zu kämpfen. Bei all diesen Projekten geht es um das Abhängigkeitsmanagement. Und ich suche nach Best-Practice-Ratschlägen.

1) Woher weiß ich, was ich genau benutze?

Ich habe keine Möglichkeit, eine Version einer statischen Bibliothek zu erhalten. Als Ergebnis muss ich irgendwie verfolgen, welche Version der statischen Bibliothek ich verwende (kann SHA eines Commits sein, aus dem es erstellt wurde)?

Dies ist besonders wichtig, wenn ich herausfinden muss, wann diese Bibliotheken aktualisiert werden müssen.

2) Wie reproduziere ich den Build?

Ich hätte mich schwer tun können, eine bestimmte Bibliothek für eine bestimmte Plattform zu erstellen. Ich habe eine Weile gebraucht, um es herauszufinden.

Das nächste Mal, wenn ich dieselbe Bibliothek erstellen muss, könnte in einem halben Jahr sein (wenn ich aus irgendeinem Grund ein Upgrade durchführen muss. Bis dahin werde ich mich jedoch nicht mehr an irgendetwas und eine Umgebung erinnern, auf der sie erstellt wurde wird lange weg sein.

3) Sollte ich diese Bibliotheken mit einer Kopie des Quellcodes versehen?

Dies ist ein geringeres Problem. Es ist jedoch immer noch ein Problem. Es ist schön sicherzustellen, dass Builds reproduzierbar sind (und dies erfordert Quellcode).

Victor Ronin
quelle

Antworten:

5

Müssen Sie wirklich immer eine genaue Version einer abhängigen Bibliothek verwenden? Ist es schlecht geschrieben / bricht es die API bei jeder geringfügigen Erhöhung der Version?

Wenn Sie sich Open-Source-Projekte ansehen, configureprüfen deren Build- Skripte ( meistens teilweise), ob verschiedene Bibliotheken vorhanden sind, und geben andernfalls einen Fehler aus. Es ist auch flexibel genug, um dem Benutzer das Verknüpfen mit einer neueren Version der Bibliothek zu ermöglichen (die wahrscheinlich mehr Fehler- / Sicherheitskorrekturen bietet als eine ältere), und erzwingt auch keine statische oder dynamische Verknüpfung.

Wenn Sie wirklich reproduzierbare Builds benötigen, sollten Sie auch auf die genaue Version des Compilers und seiner Standardbibliotheken achten, möglicherweise sogar auf das Betriebssystem. In diesem Fall ist es meiner Meinung nach besser, eine Build-Maschine mit genau der von Ihnen benötigten Umgebung zu haben, als kompilierte Bibliotheken im Quellcode-Repository einzuchecken.

D. Jurcau
quelle
2
Ich glaube nicht, dass ich eine exakte Version verwenden muss. Ich muss jedoch wissen, welches ich verwende. Wenn zum Beispiel jemand feststellt, dass OpenSSL 1.1.0b eine große Sicherheitslücke aufweist, weiß ich besser, ob ich OpenSSL 1.1.0b oder 1.1.0c verwende
Victor Ronin
In Bezug auf die Reproduzierbarkeit von Builds ist dies wahrscheinlich mein zweitrangiges Anliegen.
Victor Ronin
3

Woher weiß ich, was ich genau benutze?

Wenn die Include-Dateien oder libs-Dateien noch keine Versionsnummer enthalten, fügen Sie jedem lib-Ordner selbst eine Textdatei "version.txt" (mit der Versionsnummer) hinzu und checken Sie diese zusammen mit der lib- und include-Datei in Ihr VCS ein . Wenn Sie jedoch die vollständige Quelle der Bibliothek versionieren (Punkt 3), ist die Wahrscheinlichkeit hoch, dass bereits eine Quellcodedatei mit der Versionsnummer vorhanden ist, sodass Sie in diesem Fall keine eigene pflegen müssen.

Wie reproduziere ich den Build?

Versuchen Sie, so viel wie möglich zu automatisieren. Verwenden Sie Skripte, Makefiles oder Dateien Ihrer bevorzugten Build-Tools. Stellen Sie dies alles unter Quellcodeverwaltung. Wenn manuelle Schritte erforderlich sind, schreiben Sie die Details in eine Textdatei (z. B. readme_build.txt) und stellen Sie diese ebenfalls unter die Quellcodeverwaltung.

Sollte ich diese Bibliotheken mit einer Kopie des Quellcodes versehen?

Sie sollen eine haben Kopie des Quellcodes , sondern Gabel nur bei Bedarf (zum Beispiel, wenn Sie einen dringenden Fehler stolpern, und der ursprüngliche Autor nicht beheben kann es contraints innerhalb Ihrer Zeit). Oder wenn die Autoren eine andere Compilerumgebung als Sie verwenden und einige Änderungen vorgenommen werden müssen, damit die Bibliothek in Ihrer Umgebung funktioniert. Beachten Sie jedoch, dass jede Änderung des ursprünglichen Quellcodes in Ihrem Fork höchstwahrscheinlich die Integration von Updates zu einem späteren Zeitpunkt erschwert.

Trotzdem empfehle ich, eine Kopie des ursprünglichen (ungegabelten) Quellcodes der von Ihnen verwendeten Bibliotheken zu erhalten. Auf diese Weise können Sie die Bibliothek später teilen oder warten, wenn dies erforderlich wird, selbst wenn der ursprüngliche Betreuer beschließt, die Bibliotheksquellen aus dem öffentlichen Web zu widerrufen.

Doc Brown
quelle
Die Antwort lautet also "mach das manuell" :) Ich hatte gehofft, dass jemand sagt ... oh ... es gibt ein Tool dafür :) Wenn du "Kopie des Quellcodes" sagst, meinst du, hol dir einfach eine TAR-Datei mit der Quelle und Dump in der Quellcodeverwaltung?
Victor Ronin
1
@ VictorRonin: Nein, die Antwort lautet "Lassen Sie Ihr VCS alles erledigen, was es für Sie tun kann" und "Automatisieren Sie so viel wie möglich mit Standard-Build-Tools". Sie sind derjenige, der eine bestimmte Version auswählt, und Sie sind derjenige, der die Erstellungsschritte definieren, Referenzen für Ihre Umgebung verknüpfen und einschließen muss. Das Standardverfahren zum Manifestieren dieser Abhängigkeiten ist durch Skripte, Makefile, Projektdateien usw.
Doc Brown
... und wie Sie den Quellcode der Bibliothek oder der Bibliotheken erhalten, hängt davon ab, wie der Betreuer / Anbieter ihn bereitstellt. Vielleicht ein Teerball, vielleicht durch direkten Zugang zum Git Hub, vielleicht ein Nuget-Paket.
Doc Brown