Das Patchen von Open Source-Software beim Upgrade ist keine Option?


13

Ich bin kürzlich auf einen ziemlich nervigen (bestätigten) Fehler in einem Open Source-Softwarepaket gestoßen, das ich in meine Anwendung integriert habe. Laut dem Public Issue Tracker wurde dieser Fehler in der neuesten Version der Software behoben.

Gelegentlich BRAUCHEN Sie diese Fehlerbehebung, um einen teuren Umbau eines bestimmten Moduls zu vermeiden. Aus technischen und / oder politischen Gründen können Sie jedoch kein Upgrade auf die neueste Version durchführen.

Bei der Überprüfung der vorgenommenen Codeänderungen scheint die Korrektur so einfach zu sein, dass ich der Meinung bin, dass es eine sinnvolle Option wäre, den Code selbst zu patchen und meine derzeit genehmigte Version der Software erneut zu kompilieren. Kritiker möchten jedoch argumentieren, dass dies fast immer eine schlechte Idee ist , dass es riskant ist und eine lästige Komplexität mit sich bringt.

In ihren Augen muss diese Codeänderung Teil unserer Codebasis sein, da sie von uns ausschließlich für unsere Zwecke vorgenommen wurde. Dies bedeutet, dass wir die Open-Source-Software nicht als Abhängigkeit von Dritten einführen, sondern als neues Projekt einführen und integrieren müssen Es ist automatisiert in unseren Build-Prozess zu integrieren.

Für mich ist das falsch, da wir den Code aus dem Quellcodeverwaltungs-Repository in unser Repository ziehen und die Historie hinter den zuvor vorgenommenen Codeänderungen verlieren. Außerdem scheint es einfach viel zu kompliziert für eine so kleine Codeänderung zu sein, die vorgenommen werden muss.

Wäre es in diesem Fall eine schlechte Idee, obiges zu tun? Wenn ja, was ist die ideale Situation, wenn sich Open Source ändern muss, aber nur zu Ihrem eigenen Vorteil?


1
Bitte lassen Sie mich wissen, wenn Sie der Meinung sind, dass die Frage nicht konstruktiv ist oder verbessert werden kann.
maple_shaft

Wenn Sie das in Ihre Software integrierte Tool nicht aktualisieren können, müssen Sie das Tool nur patchen, damit der Fehler behoben wird. Es ist wichtig, das Tool nur dann nicht zu aktualisieren, wenn Sie Ihren eigenen Code überarbeiten müssen.
Ramhound

Antworten:


12

Wenn Sie keine neuere Version verwenden können, bei der das aufgetretene Problem nicht auftritt, haben Sie nur die folgenden Optionen

  • Lebe mit dem Problem und finde einen Workaround
  • Gabele die Bibliothek und repariere sie in deiner privaten Version (was du effektiv tun würdest)
  • Werfen Sie das Handtuch und sagen Sie Ihren Managern, dass das Problem unüberwindlich ist (was eine Lüge wäre, da Ihnen zwei weitere Optionen offenstehen).


Ich war in Ihrer Position, Option 2 (eine benutzerdefinierte Gabel herstellen) ist häufig die schmackhafteste verfügbare Lösung. Das ist das Leben im Umgang mit Open-Source-Bibliotheken, insbesondere solchen, die sich schnell weiterentwickeln und die schlechte Angewohnheit haben, die Abwärtskompatibilität zwischen Releases zu brechen (was meiner Erfahrung nach der häufigste Grund ist, solche Dinge tun zu müssen).
Für mehr als einige OSS-Bibliotheken hat es mich und die Teams, denen ich angehört habe, dazu veranlasst, Wrapper für alle zu verwenden und auf die Funktionalität von Bibliotheken von Drittanbietern ausschließlich über diese Wrapper zuzugreifen. Auf diese Weise beschränken sich die Änderungen zumindest weitgehend auf diesen Wrapper, wenn wir eine Drittanbieter-Bibliothek durch eine andere Version ersetzen müssen, die unseren Code beschädigt. Es ist nicht das Schönste (fügt Code hinzu, kann Komplexität und Kostenleistung erhöhen), aber manchmal ist es die einzige Möglichkeit, Ihre Vernunft zu bewahren.


Interessant! Ich habe nie darüber nachgedacht, die Bibliothek zu verpacken, um die Entkopplung zu erleichtern. Danke für deinen Beitrag!
maple_shaft

Wrapper sind eine gute Idee, wenn Sie sie von Platz eins verwenden. Wenn Sie die Bibliothek bereits direkt verwenden, muss für den Wechsel zu einem generischen Wrapper viel Code umgestaltet und erneut getestet werden.
Blrfl

1
@Blrfl ja, deshalb ist es kein Schritt, den man leicht nimmt. In mindestens einem Fall ließ eine 3rd-Party-Bibliothek (OSS) alle ihre Pakete und Klassennamen zwischen zwei kleineren Releases ändern und musste sie nur übernehmen, sodass das Refactoring trotzdem durchgeführt werden musste. Auf diese Weise haben wir einen Zukunftssicherheitsnachweis erbracht und das Problem behoben, das die Verwendung der neuen Version erforderlich machte.
jwenting

@jwenting: Stimme absolut zu. Ich mache dasselbe mit Boost, weil einige ihrer Implementierungen zwar gut sind, die Schnittstellen aber stumpf sein können. Das und sie neigen dazu, Dinge häufig zu ändern.
Blrfl

2
Beachten Sie, dass einige Linux-Distributionen ihre eigenen "Gabeln" von Software beibehalten, indem sie Sicherheitspatches auf frühere Releases zurückportieren.
Liori

6

Was Sie tun werden, ist eine schlechte Idee in dem häufigeren Fall, in dem Sie Software von Drittanbietern bündeln und beabsichtigen, deren Veröffentlichungen zu verfolgen . Normalerweise tun dies die Leute, weil sie eine Funktion in der Komponente eines Drittanbieters wünschen, die die Betreuer nicht bereit sind, zu implementieren oder in der von Ihnen benötigten Weise zu implementieren.

Sie haben jedoch ausdrücklich erklärt, dass Sie den mitgelieferten Code nicht aktualisieren werden. Das macht Sie effektiv zum Betreuer der Drittanbieter-Komponente. Ob das Patchen eine gute Idee ist oder nicht, hängt daher nur davon ab, ob Sie diesen Code gut genug verstehen , um von dem gewünschten Effekt überzeugt zu sein. Ihre Integrationstests sollten ausreichen, um zu überprüfen, ob tatsächlich das getan wird, was Sie annehmen. Daher scheint es mir, als ob Ihre Gutachter sich irren, wenn Sie die Situation beschreiben.


3

Daran ist wirklich nichts auszusetzen, solange alle Kosten, Nutzen und Risiken tragen können.

... das Update scheint einfach genug zu sein ... um den Code selbst zu patchen

Wenn Sie einen Job zu erledigen haben, ist das Perfekte (eine Bibliothek von Drittanbietern, die genau das ist, was Sie wollen) der Feind des Guten (das Patchen selbst), und manchmal müssen Sie solche Dinge tun. Ich habe eine Reihe von Projekten durchgeführt, in denen wir Quelllizenzen für kommerzielle Bibliotheken gekauft haben, damit wir Probleme beheben können, bevor der Anbieter dazu kam.

... Kritiker argumentieren, dass dies fast immer eine schlechte Idee ist, da es riskant ist und eine lästige Komplexität mit sich bringt.

Es ist eine schlechte Idee, wenn Sie nicht die nötigen Mittel haben, um den Code eines anderen zu zerlegen, ein Problem zu identifizieren und eine Lösung zu finden. Dies gilt unabhängig davon, ob der Code intern oder von Dritten stammt. Der einzige Unterschied ist, ob es über eine Kabine oder eine Gebäudewand geworfen wurde, bevor es in Ihrem Schoß landete.

Wenn Ihre Kritiker die Idee einfach beiseite schieben, ohne die Kosten dafür abzuwägen, dass sie diesen Patch nicht machen, machen sie ihre Hausaufgaben nicht. Wenn Sie eine Menge internen Code haben, der von dem Fehler betroffen ist, den Ihr Patch beheben würde, müssen Sie ihn durchgehen und ändern, um ihn zu umgehen und alles erneut zu testen, um sicherzustellen, dass er ordnungsgemäß funktioniert. Sollten Sie dann jemals ein Upgrade des Pakets auf eine Version mit Fehlerbehebung durchführen, müssen Sie möglicherweise Ihre Problemumgehungen finden, entfernen und erneut testen. Dies birgt auch Risiken, wie das Fehlen eines geänderten Falls oder unzureichende Tests. Persönlich, wenn ich die Gelegenheit habe, einen Fehler an der Quelle zu beheben, würde ich es lieber dort tun, als den Rest des Codes mit einer Fliegenklatsche zu durchforsten und hoffe, ich bekomme alles.

... die Codeänderung wurde von uns vorgenommen ... sie muss Teil unserer Codebasis sein ... wir müssen sie als neues Projekt einführen und ihre automatisierte Erstellung in unseren Erstellungsprozess integrieren.

Wenn Sie einen Patch ausführen, ist der Patch Teil Ihres eigenen Codes, was bedeutet, dass Sie ihn Teil Ihres Prozesses machen müssen. Dies ist nichts anderes als das Hinzufügen von etwas, das zu 100% Ihrem Code entspricht. Behandeln Sie die Distribution eines Drittanbieters als unantastbar und fügen Sie sie wie Quellcode in ein Modul ein. Alle von Ihnen geschriebenen Patches werden in separaten Dateien gespeichert und im Rahmen des Erstellungsprozesses angewendet. Auf diese Weise wechseln Sie immer von einer sauberen Quelle zu einer gepatchten Quelle zu einem erstellten Produkt und können genau zeigen, was los ist. (Einige Leute entpacken, patchen, packen und lagern das in der Versionskontrolle. Das ist schlecht.)

... wir würden ihren Code aus ihrem Quellcodeverwaltungs-Repository in unser Repository ziehen und die Historie hinter jeglichen Codeänderungen verlieren ...

Wenn Sie die Bibliothek eines Drittanbieters als Abhängigkeit eines Drittanbieters behandeln, haben Sie diese Historie zunächst nicht und verlieren nichts. Wenn Sie weiterhin Zugriff auf das Repository des Drittanbieters haben, können Sie dies bei Bedarf nachlesen. Die Releases von Drittanbietern sollten wie amorphe Blobs behandelt werden, die Sie unverändert in Ihr eigenes System einchecken. Wenn Sie sich die Änderungen zwischen der von Ihnen verwendeten Version und späteren Versionen ansehen müssen, können Sie dies tun und, falls Sie möchten, Patches für die alte Version erstellen, die die von Ihnen gewünschten Änderungen enthalten.

Außerdem scheint es einfach viel zu kompliziert für eine so kleine Codeänderung zu sein, die vorgenommen werden muss.

Wenn Ihr Erstellungsprozess ausreichend komplex ist, sollte das Hinzufügen nicht schwieriger sein als das Hinzufügen Ihres eigenen Codes. Es ist ein kleiner Arbeitsaufwand, bis der Entpackungs- / Patch- / Build-Prozess automatisch abläuft, aber sobald er abgeschlossen ist, ist er für immer abgeschlossen. Möglicherweise gibt es jetzt einen Fehler, aber in Zukunft könnten es zwanzig sein. Wenn ja, sind Sie viel glücklicher, dass Sie jetzt die Grundlagen dafür gelegt haben, um all das zu unterstützen, denn die nächsten 19 Jahre werden weniger Arbeit erfordern.


2

Was Sie tun möchten, scheint vernünftig zu sein, aber es scheint (vernünftige) Gründe dafür zu geben, sich dagegen zu wehren. Ich werde die vorgeschlagenen Lösungen nicht vergleichen, aber vielleicht gibt es eine Möglichkeit, wie Sie Ihren Kuchen haben und ihn auch essen können:

Wenn das betreffende Open-Source-Projekt dies zulässt, tragen Sie Ihren Back-Port-Bugfix in dessen Repository ein. Wenn Sie also Version 1.5.2 verwenden und die aktuelle stabile Version 1.6.1 ist, tragen Sie einen Patch zu 1.5.2 bei. Wenn es übernommen wird, können Sie die feste Quelle direkt aus dem Repository abrufen (möglicherweise als Version 1.5.3) und alle glücklich machen.

Mit anderen Worten: Patchen Sie es auch für alle anderen, die sich in Ihrer Situation befinden. Dies ist natürlich nur möglich, wenn das Projekt Updates auf freigegebene Versionen unterstützt (oder zumindest zulässt). Aber das ist heutzutage sicherlich ziemlich üblich.

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.