Wie halte ich meine Bibliotheken von Drittanbietern auf dem neuesten Stand?


28

Angenommen, ich habe ein Projekt, das von 10 Bibliotheken abhängt, und innerhalb des Stamms meines Projekts kann ich beliebige Versionen dieser Bibliotheken verwenden. Also fange ich mit den neuesten Versionen an. Jede dieser Bibliotheken wird dann einmal im Monat (im Durchschnitt) aktualisiert. Um meinen Kofferraum vollständig auf dem neuesten Stand zu halten, müsste jetzt alle drei Tage eine Bibliotheksreferenz aktualisiert werden.

Das ist offensichtlich zu viel. Obwohl normalerweise Version 1.2.3 ein Ersatz für Version 1.2.2 ist, wissen Sie es nie , ohne es zu testen. Unit-Tests sind nicht genug; Wenn es sich um eine DB / Datei-Engine handelt, müssen Sie sicherstellen, dass sie ordnungsgemäß mit Dateien funktioniert, die mit älteren Versionen erstellt wurden, und möglicherweise umgekehrt. Wenn es etwas mit der Benutzeroberfläche zu tun hat, müssen Sie alles visuell überprüfen. Und so weiter.

Wie gehst du damit um? Einige mögliche Ansätze:

  • Wenn es nicht kaputt ist, reparieren Sie es nicht . Behalten Sie Ihre aktuelle Version der Bibliothek bei, solange Sie bei der Verwendung in Ihrer Anwendung nichts Falsches bemerken, unabhängig davon, wie oft der Bibliotheksanbieter Aktualisierungen veröffentlicht. Kleine inkrementelle Änderungen sind nur Verschwendung.
  • Aktualisieren Sie regelmäßig, um Änderungen gering zu halten. Da Sie in jedem Fall eines Tages ein Update durchführen müssen, ist es besser, ein Update häufig durchzuführen, damit Sie Probleme frühzeitig bemerken, wenn sie einfach zu beheben sind, anstatt mehrere Versionen zu überspringen und potenzielle Probleme sich ansammeln zu lassen.
  • Etwas dazwischen. Gibt es einen Sweet Spot?

1
+1: Ich frage mich, ob Sie wie bei "Fehlerjagden" eine Iteration von "Sprint aktualisieren" in einem Projekt haben könnten. Neugierig auf Antworten :)
Matthieu

Antworten:


25

Ich bin schockiert - und in der Tat entsetzt - über die Anzahl der Antworten, die hier lauten: "Nicht aktualisieren, es sei denn, Sie müssen". Ich habe das getan, und obwohl es kurzfristig einfacher ist, brennt es auf lange Sicht höllisch. Häufigere, kleinere Updates sind sehr viel einfacher zu verwalten als gelegentlich größere, und Sie profitieren früher von neuen Funktionen, Fehlerkorrekturen usw.

Ich kaufe nicht die Idee, dass Bibliotheksänderungen schwieriger zu testen sind als Codeänderungen. Es ist genau das Gleiche - Sie nehmen eine Änderung an der Codebasis vor und müssen diese validieren, bevor Sie ein Commit durchführen und bevor Sie sie freigeben. Dafür müssen Sie jedoch bereits über Prozesse verfügen, da Sie Codeänderungen vornehmen!

Wenn Sie in zwei bis vier Wochen dauernden Iterationen arbeiten, empfehle ich, die Aktualisierung von Bibliotheken einmal pro Iteration vorzunehmen, und zwar so bald wie möglich nach dem Start, wenn die Dinge etwas entspannter sind als kurz vor einer Iteration Abgabetermin und das Projekt hat mehr Kapazitäten, um Veränderungen zu absorbieren. Lassen Sie jemanden (oder ein Paar, wenn Sie Pair-Programmierung durchführen) sich hinsetzen, schauen Sie sich an, welche Bibliotheken aktualisiert wurden, und versuchen Sie, alle neu zu erstellen und zu testen. Etat vielleicht einen halben Tag bis einen Tag für jede Iteration. Wenn es funktioniert, überprüfen Sie die Änderungen (ich gehe davon aus, dass Sie die Bibliotheken in der Quellcodeverwaltung behalten, wie wir es tun; ich bin nicht sicher, wie Sie die Änderung auf kontrollierte Weise verbreiten würden, wenn nicht). Dies ist natürlich viel einfacher, wenn Sie automatisierte Tests durchführen, als wenn die Tests vollständig manuell durchgeführt werden.

Die Frage ist nun, was Sie tun, wenn ein Update Probleme verursacht. Nehmen Sie sich Zeit, um diese zu beheben, oder lassen Sie es weg? Ich würde vorschlagen, sich zu letzterem zu neigen; Wenn es in einer Stunde behoben werden kann, tun Sie es, aber wenn ein Update einen erheblichen Integrationsaufwand erfordert, dann erhöhen Sie es als Ihre eigene Entwicklungsaufgabe, die wie jede andere geschätzt, priorisiert und geplant werden muss. Die Chancen stehen gut, dass die Priorität niedrig ist, wenn dies keine entscheidenden Korrekturen oder Verbesserungen mit sich bringt, und Sie werden nie daran vorbeikommen. Sie werden jedoch nie wissen, dass sich das Problem zu dem Zeitpunkt, zu dem der nächste iterative Aktualisierungstag beginnt, möglicherweise selbst behoben hat. Auch wenn nicht, zumindest wissen Sie jetzt, dass der Update-Pfad eine Straßensperre enthält, die Sie nicht überrascht.

Wenn Sie keine Iterationen dieser Länge durchführen, würde ich eine Art eigenständigen Zeitplan für Updates einrichten - nicht länger als monatlich. Gibt es einen anderen Projektrhythmus, an den Sie ihn binden könnten, wie eine monatliche Statusüberprüfung oder ein Architekturratstreffen? Zahltag? Pizza Nacht? Vollmond? Was auch immer, Sie müssen etwas finden, das viel kürzer ist als ein herkömmlicher Veröffentlichungszyklus, da der Versuch, alle 6 bis 18 Monate alles auf einmal zu aktualisieren, schmerzhaft und demoralisierend sein wird.

Wenn Sie vor der Veröffentlichung Stabilisierungszweige ausführen, wenden Sie diese Richtlinie nicht auf diese an. Dort würden Sie nur Bibliotheken aktualisieren, um wichtige Korrekturen zu erhalten.


3
+1. Ich habe an einem Projekt gearbeitet, in dem die Entwickler die Richtlinie "Wenn es nicht kaputt ist, repariere es nicht" angewendet haben. Dann fanden wir ein Problem mit einer Drittanbieter-Bibliothek (relativ geringfügig, aber für ein neues Feature erforderlich), das erst in einer viel späteren Version behoben wurde, die wiederum von einer viel späteren jvm abhing. Mit dem späteren jvm fanden wir Probleme mit anderen Bibliotheken von Drittanbietern, die nun nacheinander aktualisiert werden mussten. Wir mussten auch unsere Hardware aufrüsten, da Oracle kein 32-Bit-JVM mehr für Solaris hat. Es war ein Durcheinander und hätte so leicht verhindert werden können, wenn man einfach die Dinge auf dem neuesten Stand gehalten hätte.
Firtydank

+1 für "Kurzfristig ist es zwar einfacher, aber auf lange Sicht brennt es höllisch". Ich habe beide Ansätze erlebt, und obwohl viele kleine Aktualisierungen als störend empfunden werden können, ist es oft nicht möglich, in angemessener Zeit ein Upgrade von 10 Bibliotheken von Versionen durchzuführen, die 2 Jahre alt sind. Sie haben ein System, das von veralteten und nicht mehr verwalteten Bibliotheken abhängt. Sie können einige andere Bibliotheken nicht verwenden, da sie eine neuere Version dieser Bibliothek benötigen, die Sie nicht aktualisieren können, und irgendwann verlieren Sie die Fähigkeit, einige Probleme zu beheben alle.
Michał Kosmulski

@firtydank Ich bin gespannt, was ihr getan habt, um dieses Problem nachträglich zu lösen. Hast du irgendwelche neuen Richtlinien implementiert? Was war die funktionale Änderung in der Organisation?
buddyp450

10

Ich bewerte.

  • Zunächst suche ich nach Fehlern, die wir in dieser Bibliothek gefunden haben, und überprüfe, ob sie behoben wurden.
  • Zweitens suche ich nach anderen Bugfixes in der Bibliothek, von denen wir profitieren könnten (vielleicht etwas, das ein möglicher Eckfall ist).
  • Drittens suche ich nach Verbesserungen in der lib / API und untersuche dann die Auswirkungen der Änderung unseres Codes, um dies und den Vorteilsausgleich zu nutzen. Ich habe in der Vergangenheit nur allzu oft Libs upgegradet, ohne ihre neuen Funktionen tatsächlich zu nutzen, wirklich albern!

Dann wäge ich das alles gegen das Beibehalten der vorhandenen Bibliothek ab.

Immer testen - hoffentlich stellen Ihre Unit- / Integrationstests sicher, dass keine größeren Regressionen auftreten.


7

Das Hauptproblem bei Bibliotheken von Drittanbietern besteht darin, dass Sie IHRE Anwendung beim Aktualisieren erneut testen müssen, bevor sie in Produktion gehen kann. Wenn Sie also einen gemeldeten Fehler haben, für den eine Bibliothek aktualisiert werden muss, berühren Sie ihn erst, wenn Sie die Zeit haben, einen vollständigen Qualitätssicherungszyklus durchzuführen.

Dies geschieht normalerweise bei der Veröffentlichung einer neuen Version.

Ich würde jedoch vorschlagen, dass Sie eine Testsuite für die fortlaufende Erstellung haben, mit der Sie die Bibliotheken im Entwicklungszweig automatisch aktualisieren können. Auf diese Weise stellen Sie sicher, dass Sie frühzeitig feststellen, wann der Fehler auftritt, und können Fehlerberichte an das Projekt senden.


3

Teilweise wie in svn vendor branches beschrieben . Die dort beschriebene Vorgehensweise ist sehr nützlich, wenn Sie Open-Source-Bibliotheken von Drittanbietern noch lange verwenden und Änderungen vorgenommen haben, um sie an Ihre Bedürfnisse anzupassen.


2
Bitte lassen Sie nicht nur Links fallen. Links neigen dazu zu verschwinden. Überlegen Sie sich bitte, zumindest zusammenzufassen, worauf Sie verweisen. Wenn diese Verbindung unterbrochen wird, wie nützlich wäre dies in ein paar Jahren?
Tim Post

Und hochgestuft :)
Tim Post

2

Ich würde darüber nachdenken, alle Bibliotheken eines Projekts kurz vor oder kurz nach einer Veröffentlichung zu aktualisieren. Dies kann jedoch außer Kontrolle geraten, wenn Sie sich auf mehr als 10 oder 15 Bibliotheken verlassen. In diesem Fall kann eine Art Update-Überprüfungsmechanismus sehr hilfreich sein. Dies hat den Vorteil, dass Sie Zeit zum Testen Ihrer Bibliotheken haben und Probleme in einem Durchgang beheben können. Sie müssen auch nicht ständig die Aktualisierungen jeder einzelnen Bibliothek nachverfolgen, sondern müssen nur an einem bestimmten Tag nach Aktualisierungen suchen.

Ich würde auch gegen jede Art von Auto-Update-Funktion in einem Dev-Zweig verstoßen. Es wäre frustrierend, wenn ich mitten in der Arbeit an etwas, an dem das Projekt scheitern würde, weil sich eine Bibliothek automatisch aktualisiert, oder ich plötzlich Abschreibungswarnungen für die Verwendung einer API bekomme, die gerade von etwas anderem abgelöst wurde.


2

Sie müssen sich fragen, was Sie wirklich von dem Update wollen? Die meisten Sicherheitskorrekturen sind eigentlich triviale Patches in Form von Korrekturen:

  • Off-by-One-Fehler, bei denen beliebiger Code in einen nicht verwendeten Bereich in einem Puffer kopiert werden kann
  • Baumelnde Zeiger oder etwas anderes, das undefiniertes, aber (eher) deterministisches Verhalten auslöst
  • Bugs, die DoS erlauben
  • Bugs, die das versehentliche Aufspüren privater Daten erleichtern
  • Mathe stolpert
  • Maintainer, die Dinge anfassen, die sie nicht sollten (Debian-SSL-Fehler, irgendjemand?)

Wenn Sie sich die meisten CVEs in den letzten fünf Jahren ansehen, sind die Patches, mit denen sie behoben wurden, in der Regel recht trivial, wenn Sie offene Bibliotheken verwenden, was ich hoffe, dass Sie es sind.

Dann haben Sie aktuelle Fehlerbehebungen, die Sie wahrscheinlich möchten, aber vielleicht haben Sie sie bereits selbst behoben. Wenn es nicht kaputt ist, reparieren Sie es nicht.

Schließlich haben Sie neue Funktionen ... und möglicherweise veraltete Funktionen. Sie müssen diese Versionshinweise und Unterschiede sorgfältig prüfen. Können Sie sie verwenden, auch wenn sie eine API beschädigen, von der viele andere Dinge abhängen? Wenn ja, ist es Zeit für eine Operation. Wenn nein, wählen Sie aus, was Sie möchten, und fahren Sie fort.

Einige mögen mit mir nicht einverstanden sein, aber ich lehne es ab, eine Bibliothek ohne Quellcode zu verwenden.


Sicherlich bevorzuge ich Open-Source-Bibliotheken, aber ich verwende auch einige kommerzielle Bibliotheken, die wie 100 US-Dollar ohne Quelle oder
10.000

2

Dies hängt davon ab, für welche Bibliotheken sie verwendet werden, wie umfassend sie in Ihrem Code sind, welche Kosten (in Bezug auf Zeit und Geld) für die Durchführung des Upgrades anfallen usw.

Idealerweise hätten Sie immer den neuesten Stand, aber wenn die neue Version nicht abwärtskompatibel ist, was dann? Möglicherweise müssen Sie dieses Update für eine zukünftige Version zurückstellen, bis Sie die Änderung sorgfältig handhaben können. Möglicherweise hat sich das Verhalten geringfügig geändert (z. B. "Sie müssen jetzt die Eigenschaft X festlegen, bevor Sie die Methode Y aufrufen, oder es tritt ein langsamer Speicherverlust auf"), der beim Testen nur schwer zu überprüfen ist.

Auf der anderen Seite könnte die neue Version einige schwerwiegende Sicherheitskorrekturen enthalten, so dass Sie dies ebenfalls berücksichtigen müssen.

Kurzfassung: Nehmen Sie es von Fall zu Fall.


1

Dies würde von Ihren Release-Zeitplänen abhängen.

Mein Rat wäre jedoch, eine Reihe von Bibliotheken auf allen Entwicklermaschinen zu installieren. Betrachten Sie es als Goldstandard, wenn Sie es als etwas bezeichnen möchten, und beginnen Sie mit der Entwicklung für dieses Release.

Bewerten Sie Ihre Bibliotheken, ihre Versionen und Funktionen erst, wenn das Release bereitgestellt wurde und Sie sich in der Post-Release-Phase befinden. Wenn sie einige wesentliche Verbesserungen oder neue Funktionen bieten, installieren Sie sie vor dem Start des nächsten Entwicklungszyklus.

Installieren Sie neue Versionen nur, wenn ein schwerwiegendes Problem oder ein Fehler vorliegt, der vor der Bereitstellung der Software behoben werden muss.

Es bedeutet, dass Sie einige Versionen verpassen werden, aber es sollte einige Kopfschmerzen und Versionsprobleme ersparen, sodass Sie sich auf die Entwicklung Ihrer Anwendung konzentrieren können.


1

Subversion Externals

Das Besondere an dieser Funktion ist, dass Sie die gewünschte Revision angeben können.

Bitte beachten Sie, dass Aktualisierungen langsamer sind, wenn Sie viele externe Geräte haben.


Eigentlich benutze ich sie und sie sind sehr nützlich und sehr langsam. X-) Aber sie lösen nicht das Problem, wann ich auf die neuere Version updaten sollte.
Joonas Pulakka

Sie können ja sehr langsam sein. Normalerweise aktualisiere ich externe Bibliotheken, wenn: (eine Hauptversion ODER eine Fehlerbehebung, die mich betrifft, verfügbar ist) UND ich mich in der ersten Hälfte der Iteration befinde.

1

Ich richte gerade so etwas ein:

  • 1 Mercurial Repo für jede Erweiterung meiner Anwendung
  • Ein Mercurial Repo, das bestimmte Versionen mehrerer Bibliotheken von Drittanbietern sammelt
  • ein SVN-Repo für Grafikressourcen / Werke (kann sich aber zu etwas anderem ändern)
  • Ein Mercurial Repo für meine Anwendung, das die Mercurial Subrepos-Funktion verwendet, um eine bestimmte Version des 3rd Pary Repo und einige der grundlegenden Erweiterungen zu verwenden

Wenn ich nun an einer Erweiterung arbeiten muss, die nicht "grundlegend" ist (implizit als Subrepo im Anwendungsrepo enthalten), klone ich das Repo einfach im Erweiterungsordner und lasse CMake die Projekte und Lösungen für die gesamte Anwendung generieren.

Auf diese Weise kann ich:

  • Ändern Sie die Drittanbieter in einem Klon, überprüfen Sie, ob es mit der App funktioniert, verschieben Sie es in das Repo des Drittanbieters und aktualisieren Sie die Subrepo-Version des Anwendungsrepos auf die neue Repo-Version des Drittanbieters
  • arbeiten Sie selbständig an Erweiterungen, alle zusammen oder wählen Sie einfach eine bestimmte aus
  • Sie müssen sich keine Sorgen machen, dass Sie Projekte miteinander verknüpfen müssen. Dies wird von Cmake durchgeführt, indem die Subrepos der Projekte mit dem gesamten Anwendungsrepo gescannt werden.

Ich habe noch nicht viel Erfahrung mit dieser Organisation, aber ich denke, das ist ziemlich nützlich.


1

Wenn Ihre Software sicherheitskritisch ist, müssen Sie so schnell wie möglich aktualisieren, keine Ausreden. Sie möchten nicht, dass ein kleiner Fehler in einer Grafikbibliothek Ihr gesamtes Programm angreifbar macht.

Andernfalls, wenn die Bibliothek ausgereift ist, lautet sie "Wenn sie nicht kaputt ist, repariere sie nicht." für mich. Früher oder später benötige ich möglicherweise ein Feature einer späteren Version und habe keine andere Wahl, als es zu aktualisieren, aber bis dahin ist der Aufwand schwer zu rechtfertigen. Wenn ich dagegen mit einer relativ neuen Bibliothek oder einem relativ neuen Framework wie Grails oder ExtJS arbeite, halte ich mich mit der neuesten Version auf dem Laufenden, da sich diese Produkte noch nicht vollständig ausgereift anfühlen. Ein Update kann mich also wahrscheinlich retten Wenn Sie auf einen dieser Fehler stoßen, wurde die spätere Version behoben.


1

Ich verwende NuGet , um meine Bibliotheken von Drittanbietern auf dem neuesten Stand zu halten.

Wenn ein Freund, ein Mitarbeiter oder ein Blog mich benachrichtigt, dass eine meiner DLLs von Drittanbietern veraltet ist, können Sie sie mit NuGet ganz einfach aktualisieren.

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.