Frage

Zusammenfassung

Ich hatte kürzlich ein Gespräch mit dem Schöpfer eines Rahmens, von dem eine meiner Anwendungen abhängt. Während dieses Gesprächs erwähnte er eine Art von Abgesehen davon, dass es mir das Leben einfacher machen würde, wenn ich nur sein Framework mit meiner Bewerbung gebündelt und dem Endbenutzer eine Version geliefert würde, von der ich wusste, dass sie mit meinem Code übereinstimmt. Intuitiv habe ich immer versucht, dies zu vermeiden, und tatsächlich habe ich mich bemüht, meinen eigenen Code zu segmentieren, damit Teile davon umverteilt werden können, ohne das gesamte Projekt zu nehmen es). Nachdem ich es jedoch einige Zeit überlegt habe, konnte ich keinen besonders guten Grund finden warum Ich mache das. In der Tat, wo ich darüber nachgedacht habe, sehe ich ein ziemlich überzeugendes Gehäuse zum Bündeln alle meine kleineren Abhängigkeiten. Ich habe eine Liste von Vor- und Nachteilen erstellt und hoffe, dass jemand auf alles hinweisen kann, was ich vermisse.

Profis

  • Die Konsistenz von Versionen bedeutet eine einfachere Prüfung und Fehlerbehebung.
  • Die Anwendung kann ein breiteres Publikum erreichen, da es anscheinend weniger Komponenten zu installieren scheint.
  • Kleine Änderungen an die Abhängigkeit können leichter nachgeschaltet und mit der Anwendung geliefert werden, anstatt darauf zu warten, dass sie in die vorgelagerte Codebasis eintauchen.

Nachteile

  • Komplexerer Verpackungsprozess für Abhängigkeiten.
  • Der Benutzer kann mehrere Kopien einer Abhängigkeit von ihrer Maschine haben.
  • Laut Bortzmeyers Reaktion gibt es potenzielle Sicherheitsbedenken, wenn Sie nicht in der Lage sind, einzelne Komponenten zu verbessern.

Anmerkungen

Als Referenz ist meine Bewerbung in Python geschrieben und die Abhängigkeiten, auf die ich mich beziehe, sind "Licht", wobei ich klein und nicht in sehr häufiger Verwendung meine. (Sie existieren also nicht auf allen Maschinen oder sogar in allen Repositories.) Und wenn ich "Paket mit" meine Anwendung sage keine Chance auf widersprüchliche Versionen sein. Ich entwickle mich auch ausschließlich unter Linux weiter, sodass keine Windows -Installationsprobleme zu tun haben.

Alles in allem möchte ich auch Gedanken über das breitere (sprachunabhängige) Thema der Verpackungsabhängigkeiten hören. Fehlt mir etwas oder ist dies eine einfache Entscheidung, dass ich nur überdenken?

Addendum 1

Es ist erwähnenswert, dass ich auch sehr empfindlich auf die Bedürfnisse von nachgeschalteten Verpackern bin. Ich möchte, dass es so einfach wie möglich ist, die Anwendung in einem verteilungsspezifischen Deb oder Drehzahl einzuwickeln.

War es hilfreich?

Lösung

Ich bevorzuge Abhängigkeiten, wenn Es ist nicht möglich, ein System für die automatische Abhängigkeitslösung (dh setuptools) zu verwenden und wenn Sie können es tun, ohne Versionskonflikte einzuführen. Sie müssen noch Ihre Bewerbung und Ihr Publikum in Betracht ziehen. Ernsthafte Entwickler oder Enthusiasten möchten eher mit einer bestimmten (neuesten) Version der Abhängigkeit arbeiten. Das Bündeln von Sachen kann für sie ärgerlich sein, da es nicht das ist, was sie erwarten.

Vor allem für Endbenutzer einer Anwendung bezweifle ich ernsthaft, dass die meisten Menschen gerne nach Abhängigkeiten suchen müssen. In Bezug auf doppelte Kopien würde ich lieber 10 Millisekunden damit verbringen, einige zusätzliche Kilobyte herunterzuladen oder den Bruchteil eines Cent für den zusätzlichen Meg des Speicherplatzes zu verbringen, als 10 Minuten lang über Websites zu suchen (was möglicherweise nicht mehr sein kann ), Herunterladen, Installieren (was möglicherweise fehlschlägt, wenn Versionen unvereinbar sind) usw.

Es ist mir egal, wie viele Kopien einer Bibliothek ich auf meiner Festplatte habe, solange sie sich nicht gegenseitig in den Weg kommen. Der Speicherplatz ist wirklich sehr, sehr billig.

Andere Tipps

Kannst du dich nicht einfach auf eine bestimmte Version dieser Abhängigkeiten verlassen? ZB in Python mit setuptools Sie können angeben, welche genaue Version sie benötigt, oder sogar einige Bedingungen wie <=> usw. angeben. Dies gilt natürlich nur für Python und auf dem Specifc -Paket -Manager, aber ich würde persönlich immer zuerst versuchen, nicht alles zu bündeln. Mit dem Versand als Python -Ei haben Sie auch alle Abhängigkeiten automatisch installiert.

Möglicherweise verwenden Sie natürlich auch eine Zwei-Wege-Strategie, um Ihr eigenes Paket mit nur Links zu den Abhängigkeiten bereitzustellen und dennoch ein vollständiges Setup in einem Installationsprogramm wie Mode bereitzustellen. Aber selbst dann (im Python -Fall) würde ich empfehlen, die Eier einfach damit zu bündeln.

Für einige Einführung in Eier sehen Dieser Beitrag von mir.

Natürlich ist dies sehr pythonspezifisch, aber ich gehe davon aus, dass andere Sprache möglicherweise ähnliche Verpackungswerkzeuge haben.

Wenn Sie Software für einen Endbenutzer produzieren, ist es das Ziel, den Kunden Ihre Software zu verwenden. Alles, was im Weg steht, ist kontraproduktiv. Wenn sie Abhängigkeiten selbst herunterladen müssen, besteht die Möglichkeit, dass sie sich stattdessen entscheiden, Ihre Software zu vermeiden. Sie können nicht steuern, ob Bibliotheken rückwärts kompatibel sind, und Sie möchten nicht, dass Ihre Software nicht mehr funktioniert, da der Benutzer sein System aktualisiert hat. In ähnlicher Weise möchten Sie nicht, dass ein Kunde eine alte Version Ihrer Software mit alten Bibliotheken installiert und den Rest des Systems brechen lässt.

Dies bedeutet, dass Bündelung im Allgemeinen der richtige Weg ist. Wenn Sie sicherstellen können, dass Ihre Software reibungslos installiert wird, ohne Abhängigkeiten zu bündeln, und das ist weniger Arbeit, kann dies eine bessere Option sein. Es geht darum, was Ihre Kunden erfüllt.

Denken Sie für Linux nicht einmal an Bündelung. Sie sind nicht schlauer als der Paketmanager oder die Verpacker, und jede Verteilung nimmt ihren eigenen Weg an - sie werden nicht glücklich sein, wenn Sie versuchen, sich in den Weg zu machen. Bestenfalls werden sie sich nicht darum kümmern, Ihre App zu verpacken, was nicht großartig ist.

Denken Sie daran, dass in Linux die Abhängigkeiten für Sie automatisch gezogen werden. Es geht nicht darum, dass der Benutzer ihn bekommt. Es ist schon für Sie getan.

Für Windows zögern Sie nicht, dort zu bündeln, Sie sind dort alleine.

Ein wichtiger Punkt scheint in den Nachteilen von Bündelungsbibliotheken/Frameworks/usw. mit der Anwendung: Sicherheitsaktualisierungen vergessen worden zu sein.

Die meisten Web -Frameworks sind voller Sicherheitslöcher und erfordern häufige Patching. Jede Bibliothek muss auf jeden Fall eines Tages für einen Sicherheitsfehler aufgerüstet werden.

Wenn Sie nicht bündeln, aktualisieren Sysadmins nur eine Kopie der Bibliothek und starten Sie abhängig von Anwendungen neu.

Wenn Sie sich bündeln, werden Sysadmins wahrscheinlich noch nicht einmal kennt Sie müssen etwas aktualisieren.

Das Problem bei der Bündelung ist also nicht der Speicherplatz, sondern das Risiko, alte und gefährliche Kopien herumzulassen.

Nur meine Erfahrung, nimm es mit einem Körnchen Salz.

Meine Präferenz für ein paar Open-Source-Bibliotheken, die ich Autorin für die Unabhängigkeit von zusätzlichen Bibliotheken so weit wie möglich ist. Grund ist, dass ich nicht nur auf dem Haken bin, um zusätzliche Bibliotheken zusammen mit meiner zu verteilt, sondern auch, meine Anwendung auf Kompatibilität zu aktualisieren, da diese anderen Bibliotheken auch aktualisiert werden.

Aus den Bibliotheken, die ich von anderen verwendet habe, die Abhängigkeiten von "gemeinsamen" Bibliotheken tragen, benötige ich ausnahmslos mehrere Versionen der gemeinsamen Bibliothek auf meinem System. Die relative Update -Geschwindigkeit der Nischenbibliotheken, die ich verwende, ist einfach nicht so schnell, während die gemeinsamen Bibliotheken viel häufiger aktualisiert werden. Versioning Hölle.

Aber das spricht allgemein. Wenn ich mein Projekt und meine Benutzer jetzt durch die Integration einer Abhängigkeit unterstützen kann, schaue ich mir immer die nachgelagerten und späteren Auswirkungen dieser Entscheidung an. Wenn ich es verwalten kann, kann ich die Abhängigkeit zuversichtlich einbeziehen.

Wie immer kann Ihre Kilometerleistung variieren.

Ich füge immer alle Abhängigkeiten für meine Webanwendungen hinzu. Dies erleichtert nicht nur die Installation, die Anwendung bleibt stabil und funktioniert so, wie Sie es erwarten, auch wenn andere Komponenten des Systems aktualisiert werden.

Achten Sie auf die klassische Windows DLL Hell. Auf jeden Fall minimieren Sie die Anzahl der Abhängigkeiten: Im Idealfall hängen Sie einfach von Ihrer Sprache und ihrem Rahmen ab, nichts anderes, wenn Sie können.

Schließlich ist es kaum das Ziel, den Festplattenraum zu bewahren, sodass die Benutzer sich nicht um mehrere Kopien kümmern müssen. Wenn Sie keine winzige Anzahl von Benutzern haben, stellen Sie sicher, dass Sie die Verpackung auf sich selbst unterziehen, anstatt sie zu verpflichten, alle Abhängigkeiten zu erhalten!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top