Wenn ich über die Vor- und Nachteile eines statischen Bibliotheksordners und eines Paketmanagers nachdenke, halte ich den Bibliotheksordner für einen besseren Ansatz.
Vorteile, die ich mit einem Bibliotheksordner sehe:
- Es ist kein externes Tool zum Verwalten von Paketen erforderlich.
- Zum Aufbau ist keine Internetverbindung erforderlich.
- Schnellere Erstellung (keine Paketprüfung).
- Einfachere Umgebung (weniger Kenntnisse erforderlich).
Vorteile, die ich mit einem Paketmanager sehe:
- Hilft bei komplexen Abhängigkeitsbäumen (und das Herunterladen einer Abhängigkeit mit all ihren Abhängigkeiten kann verwaltet werden).
- Hilft bei der Überprüfung, ob eine neue Version verfügbar ist.
Anscheinend hat sich die Branche dazu entschlossen, für fast alles, was heute gebaut wird, dem Paketmanager-Pfad zu folgen. Also, was fehle ich?
packages
dependency-management
package-managers
Ignacio Soler Garcia
quelle
quelle
Antworten:
Ein wichtiger Punkt, der in den anderen Antworten fehlt:
Wenn Sie einen Paketmanager verwenden, müssen Sie eine Konfiguration haben, die angibt, welche Bibliotheksversionen Sie verwenden, und die sicherstellt, dass die Konfigurationsinformationen tatsächlich korrekt sind.
Es ist sehr wichtig zu wissen, welche Bibliotheken Sie verwenden und welche Version Sie verwenden, wenn Sie:
Wenn Sie tatsächlich aktualisieren, stellt der Paketmanager (normalerweise) sicher, dass alle transitiven Abhängigkeiten nach Bedarf aktualisiert werden.
Während bei einem
lib
Ordner nur eine Reihe von (möglicherweise binären und möglicherweise geänderten) Dateien vorhanden sind, müssen Sie erraten, woher sie stammen und welche Version sie haben (oder einer README-Datei vertrauen, die möglicherweise korrekt ist oder nicht ).Um Ihre anderen Punkte anzusprechen:
Richtig, aber a) als Softwareentwickler müssen Sie ohnehin jede Menge Tools installieren, damit eine weitere Rolle keine Rolle spielt, und b) normalerweise gibt es nur einen oder mehrere Paketmanager in einem bestimmten Bereich (Maven / Gradle für Java, npm für JS / TypeScript usw.), daher müssen Sie nicht Dutzende davon installieren.
Alle Paketmanager, die ich kenne, arbeiten offline, sobald sie die erforderlichen Abhängigkeiten heruntergeladen haben (was direkt nach dem Herunterladen des Projekts geschehen kann).
Wahrscheinlich wahr, aber es scheint unwahrscheinlich, dass die Offline-Paketprüfung viel Zeit in Anspruch nimmt (es werden nur einige Versionsnummern verglichen). Eine Online- Prüfung kann eine Weile dauern, kann aber auf Wunsch deaktiviert werden (wenn sie sogar standardmäßig aktiviert ist - Maven sucht beispielsweise nie nach Updates für Release-Versionen).
Richtig, aber wie oben erläutert,
lib
erfordert ein Ordner auch Kenntnisse. Wie oben erklärt, werden Sie wahrscheinlich nur mit einer Handvoll verschiedener Paketmanager arbeiten, die Sie bereits kennen.quelle
Die Vorteile des Ordners lib verschwinden schnell, wenn Sie von der kleinen Entwicklung zur größeren Arbeit übergehen.
Zum Beispiel wird der "Vorteil", kein externes Tool zu benötigen, durch die Arbeit übertroffen, die erforderlich ist, um Ihre Abhängigkeiten manuell zu verwalten, sodass Sie das Tool sein werden (in mehr als einem Sinne der Welt).
Sie benötigen keine Internetverbindung für einen Paketmanager. Sie können lokale Repositorys verwenden.
Ein schnellerer Build mag stimmen, aber es ist kaum etwas, das entscheiden sollte, ob ein Paketmanager verwendet werden soll oder nicht. Wir sprechen schließlich nicht über Größenunterschiede, und dies hängt auch von Ihrer Konfiguration ab. Sie können mit einem Paketmanager leicht einen langsamen Build erstellen, aber das ist im Grunde genommen Sabotage.
Einfachere Umgebungen (weniger Kenntnisse erforderlich)? Auch hier ist in kleinem Maßstab eine Entwicklung durchaus möglich. Möglicherweise können Sie das Projekt bis auf die wenigen verwendeten Bibliotheken vollständig im Kopf behalten. Fügen Sie ein einfaches Makefile oder ein anderes Build-Skript hinzu, und Sie haben ein vollständiges Paket.
Dies vereinfacht jedoch nicht die Umgebung, sondern funktioniert nur in einfachen Umgebungen. Bei der Entwicklung in größerem Maßstab werden Sie froh sein, dass Sie Standardwerkzeuge anstelle von kundenspezifischen Lösungen verwenden. Schließlich muss man es nur einmal lernen (und wenn der Paketmanager du jour durch das neue coole Ding ersetzt wird, muss man das auch lernen).
quelle
blah install libfoo
. Und dann multiplizieren Sie das mit 5 Abhängigkeiten.Ihnen fehlen viele Vorteile von Paketmanagern.
Sie übertreiben auch den Wert Ihrer "Vorteile".
"Extern" zu was? Ich checke die NuGet-Programmdatei in meine Repositories ein. Es ist die einzige Binärdatei, bei der ich mich in Ordnung fühle, da sie klein ist und bedeutet, dass ich keine anderen Binärdateien einchecken muss.
pip bereitet in dieser Hinsicht keine Probleme, da es jetzt standardmäßig mit Python gebündelt ist und inkompatible Änderungen in Abwärtsrichtung äußerst selten sind. Sie werden Python-Code sowieso nicht entwickeln, ohne Python extern in Ihrem Projekt installiert zu haben.
Zu dem Zeitpunkt, zu dem sie eine breite Akzeptanz erreichen, sind die Paketmanager in der Regel sehr stabil. Ohne eine Art global installiertes Tool für die meisten Projekte kommt man nicht davon, und ein einziger Paketmanager ist eine recht leichte Anforderung. Es ist normalerweise nicht viel umständlicher, als die Sprach-Laufzeit zu installieren.
Ich kann ohne Netzwerkverbindung keine Verbindung zu meiner Datenbank herstellen. Wenn die Datenbank von Amazon gehostet wird, benötige ich trotzdem eine vollständige Internetverbindung. Ich benötige eine Internetverbindung, um Änderungen über die Quellcodeverwaltung zu übertragen und abzurufen. Ein Build-Server kann auch ohne irgendeine Netzwerkverbindung keinen Code zum Erstellen auschecken. Ohne diese können Sie keine E-Mails senden oder empfangen . Sie können keine Bibliotheken herunterladen, um sie ohne eine in Ihrem lib-Ordner abzulegen! Eine dauerhafte Entwicklung ohne Internetverbindung ist so gut wie unbekannt. In einigen seltenen Fällen, in denen dies erforderlich ist, können Sie die Pakete an einen Speicherort herunterladen, den der Paketmanager verwenden kann. (Ich weiß, dass NuGet und pip sehr gerne von einem einfachen Ordner oder Netzwerklaufwerk abrufen. Ich vermute, die meisten anderen können das auch.)
30 Sekunden während des automatischen Builds und 5 Sekunden während des Builds lokaler Entwickler sind ein guter Kompromiss für die oben beschriebenen Vorteile. Dies sind triviale Zeitrahmen, die im Vergleich zu den Problemen, die die Vorteile lösen, normalerweise nicht einmal in Betracht gezogen werden sollten.
Ein Tool für die Paketverwaltung gegen nichts für die Bibliotheksverwaltung ist ohnehin kein fairer Vergleich. Ohne das Tool müssen Sie lernen, welchen benutzerdefinierten Prozess das Projekt verwendetum seine Bibliotheken zu verwalten. Dies bedeutet, dass Sie nie sicher sind, ob Ihr vorhandenes Wissen für ein neues Projekt gilt, an das Sie sich wenden. Sie müssen sich mit jeder Art von Trick beschäftigen, die sich jemand ausgedacht hat, oder sich selbst etwas einfallen lassen. Das könnte ein Verzeichnis sein, das alle Bibliotheken enthält, oder etwas viel Seltsameres. Vielleicht, um zu vermeiden, dass die Bibliotheken eingecheckt werden, hat jemand sie alle auf einem Netzwerklaufwerk abgelegt, und die einzige Versionsanzeige ist der Ordnername. Wie ist das oder eine globale Installation wirklich besser? Im Vergleich dazu bietet Ihnen ein Paketmanager eine saubere Konvention, die für die meisten Projekte gilt, auf die Sie stoßen.
Das gemeinsame Thema ist, dass sie Konsistenz, Dokumentation und Funktionen nicht nur innerhalb von Projekten, sondern auch über sie hinweg bieten. Dies vereinfacht das Leben aller.
quelle
Nachdem unser Produkt kürzlich von manuell heruntergeladenen Bibliotheken auf automatische Paketverwaltung mit Nuget umgestellt wurde, kann ich sagen, dass die Verwendung eines Paketmanagers enorme Vorteile hat.
Unser Produkt wird in 27 C # -Projekten implementiert, was nach heutigen Maßstäben relativ klein ist. Einige unserer Abhängigkeiten von Drittanbietern bestehen aus Dutzenden von Assemblys.
Wenn ich vor Nuget alle unsere Abhängigkeiten auf die neueste Version aktualisieren wollte, müsste ich:
Bei 27 Projekten und Dutzenden von Abhängigkeitsassemblys war dieser Prozess sehr fehleranfällig und konnte Stunden dauern.
Jetzt, da wir auf Nuget umgestellt haben, kann ich alles mit einem einzigen Befehl erledigen.
quelle
Das ist eine Art Nicht-Punkt, oder? Wenn ich einen Paketmanager verwende, muss ich keinen lib-Ordner haben. Ich muss die Pakete auch nicht selbst verwalten.
Abgesehen davon, dass es heutzutage etwas selten ist, während der Entwicklung keine Internetverbindung zu haben (vielleicht mit Ausnahme von unterwegs), sollte ein anständiger Paketmanager nicht erfordern, dass Sie die neueste Version haben, um Ihre Anwendung zu erstellen. Es könnte sich beschweren, aber es gibt keinen Grund, nicht mit der bereits installierten Version zu bauen
Das ist ein ziemlich geringfügiger Geschwindigkeitsschub, aber dafür kann man wohl einen Punkt machen.
Die meisten Paketmanager sind heutzutage so einfach, dass es sich kaum lohnt, sie zu umgehen. Es gibt sogar visuelle Kunden, wenn Sie möchten. Sie verstecken tatsächlich einen Großteil des Getreides, das gerade läuft.
Mit den Paketmanagern können Sie diese Pakete auch für verschiedene Projekte freigeben. Wenn 5 meiner Projekte dieselbe Version von Boost verwenden, muss dies nicht für jedes Projekt dupliziert werden. Dies gilt insbesondere für die komplexen Abhängigkeitsbäume, von denen Sie sprechen.
Mit einem lib-Ordner verwalten Sie Pakete nur für dieses Projekt, während ein Paketmanager dies für Ihre gesamte Entwicklungsumgebung mit einem einzigen Tool ermöglicht.
quelle
nuget.org
(die Standardvorlage sollte dies tun) bereits so eingerichtet sein).Es ist der Unterschied zwischen der Verwendung von Bibliotheken (lib-Verzeichnis) und der Verwaltung von Metainformationen (Paketmanager) . Solche Metainformationen betreffen Versionsnummern, (transitiven) Abhängigkeiten zwischen Bibliotheken und dergleichen.
Die Diskussionen über DLL-Hölle, Bibliothekskompatibilität, Java-Modul-System, OSGi und dergleichen sollten zumindest ausreichend sein, um davon zu überzeugen, dass es sich um eine Art Abhängigkeitsmanagement handelt.
Außerdem bietet ein freigegebenes (lokales) Repository den Vorteil, dass mehrere Projekte keine Kopien der importierten Bibliotheken verwalten müssen. Wenn man ein Projekt mit 20 Submodulen hat, haben einige dieser Module 40 ungerade Abhängigkeiten.
quelle
In einigen Fällen kann ein lib-Ordner erforderlich sein, z. B. wenn veraltete Bibliotheken (eine Version davon wird nicht mehr verwaltet / ist nicht verfügbar), eine lokal geänderte Version einer Bibliothek usw. verwendet werden.
Für alles andere ist es so, als würde der Entwickler die Rolle des Paketmanagers übernehmen:
Und meiner Meinung nach sind weniger Kenntnisse erforderlich, da Sie mehr über die Verwendung des externen Tools, aber weniger über die Bibliotheken (dh Abhängigkeiten) lernen müssen.
quelle
Es gibt ein weiteres Problem, das von anderen Fragen nicht abgedeckt wird: das Teilen von Deps.
Angenommen, Sie haben zwei Pakete , die dieselbe Bibliothek erstellen. Im besten Fall gibt es keine Coflicts, sondern denselben Festplatten- / SSD-Speicherplatz, der zweimal verwendet wird. Im schlimmsten Fall wird es verschiedene Konflikte geben, wie z. B. Versionen.
Wenn Sie den Paket-Manager verwenden, wird die Bibliothek nur einmal (pro Version) installiert und der Pfad bereits angegeben.
PS: Natürlich benötigen Sie eine dynamische Verknüpfung (oder eine ähnliche Funktion in Ihrer Sprache), um diesen Profi zu erhalten.
quelle
Ein Hauptgrund, warum gemeinsam genutzte Bibliotheken in Unix- und Windows-Systemen der 90er Jahre als Fortschritt angesehen wurden, war, wie sie die RAM-Auslastung senken konnten, wenn mehrere Programme mit demselben Satz von Bibliotheken geladen wurden. Code-Speicherplatz muss nur EINMAL pro genauer Bibliothek und Version dieser Bibliothek zugewiesen werden. Die einzige verbleibende Speicherverwendung pro Instanz betrifft statische Variablen.
Viele Betriebssysteme implementieren gemeinsam genutzte Bibliotheken auf eine Art und Weise, die von Mechanismen wie der Unix-API mmap () abhängt. Dies impliziert, dass eine Bibliothek nicht nur dieselbe Version, sondern tatsächlich dieselbe DATEI haben muss. Dies ist für ein Programm, das seine eigenen Bibliotheken enthält, einfach nicht voll auszunutzen.
Angesichts der Tatsache, dass Speicher weitaus billiger ist und Bibliotheksversionen vielfältiger benötigt werden als in den 90er Jahren, hat dieses Argument heute nicht mehr so viel Gewicht.
quelle