Ist es eine gute Praxis, Zweige zu verwenden, um verschiedene Editionen derselben Software zu verwalten?


72

Wir haben ein Produkt mit einigen verschiedenen Editionen. Die Unterschiede sind gering: Hier und da unterschiedliche Zeichenfolgen, in der einen wenig zusätzliche Logik, in der anderen nur sehr wenig Unterschiede in der Logik. Bei der Entwicklung der Software müssen die meisten Änderungen zu jeder Edition hinzugefügt werden. Es gibt jedoch einige, die dies nicht tun, und einige, die sich unterscheiden müssen. Ist es eine gültige Verwendung von Verzweigungen, wenn ich Verzweigungen mit Release-EditionA und Release-EditionB (..etc) habe? Gibt es irgendwelche Fallstricke? Gute Praktiken?

Update: Vielen Dank für den Einblick, viele gute Antworten hier. Der allgemeine Konsens scheint zu sein, dass es eine schlechte Idee ist, Zweige für diesen Zweck zu verwenden. Für alle, die sich fragen, besteht meine endgültige Lösung des Problems darin, Zeichenfolgen als Konfiguration zu externalisieren und die unterschiedliche Logik als Plugins oder Skripte zu externalisieren.


Antworten:


45

Dies hängt von der Größe der Änderung ab, aber ich würde es nicht als gute Praxis für die von Ihnen beschriebenen Unterschiede betrachten.

Im Allgemeinen möchten Sie, dass ein Git-Zweig in Zukunft zusammengeführt oder schreibgeschützt gespeichert wird. Git-Zweige, die auf unbestimmte Zeit nebeneinander existieren, bedeuten Arbeit für alle: Änderungen müssen verbreitet und zusammengeführt werden, Konflikte müssen gelöst werden, der ganze Spaß. Wenn nicht anders, muss jeder Entwickler daran denken, Änderungen auf fünf Repositorys anstatt auf eines zu übertragen.

Wenn Sie kleine Änderungen vornehmen, wirkt der gesamte Aufwand für das Zusammenführen und Verwalten von Zweigen im Vergleich zum Problem übertrieben. Verwenden Sie Ihren Präprozessor oder Ihr Build-System, um zwischen Versionen zu unterscheiden. Ist ein einfacher #ifdefTrick? Dann löse keine Probleme mit git, es ist übertrieben.


4
Ich würde sagen, dass dies für Git richtig ist, aber es ist interessant zu bemerken, dass mit anderen VCS-Verzweigungen für Releases / Editionen eine bessere Strategie sein könnte
jk.

16

Das ist nicht wirklich was Filialen sind. Zweige sollten kurze bis mittelfristige Nebenwege zu Ihrer Entwicklungslinie sein, nicht langfristige parallele Versionen desselben Codes.

Ich würde alle verschiedenen Versionen in den gleichen Zweig stellen, mit Unterverzeichnissen für die Teile, die sich zwischen den Editionen unterscheiden, und Ihren Erstellungsprozess einrichten (Sie haben einen automatisierten Erstellungsprozess, richtig?), So dass er jede Edition bei Bedarf ausgeben kann (oder alle auf einmal).

Schließlich möchten Sie eine "einzige Quelle der Wahrheit" behalten. Mit Verzweigungen duplizieren Sie einen Teil des Codes, jedoch nicht alle, und bestimmte Zusammenführungen würden Ihr Setup in der Tat beeinträchtigen.


Wenn es zwei Versionen derselben Klasse mit geringen Unterschieden gibt, wie würde ein automatisierter Build hier helfen? Die einzige Lösung , die mir in den Sinn kommt , ist , dass verschiedene Lösungskonfigurationen mit ( EditionA, EditionBetc.) und einschließlich dieser Art von Klassen bedingt in csprojDateien (zB <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'EditionA|AnyCPU' ">). Automatisierte Builds können diese verschiedenen Konfigurationen verwenden, um das Projekt zu erstellen. Was denkst du?
Sotn

Es hängt davon ab, welche Build-Tools Sie verwenden, aber im Allgemeinen sollten Sie eine Möglichkeit haben, dem Build-System mitzuteilen, welche Build-Konfiguration Sie möchten, und dann automatisch den richtigen Code enthalten. Ich habe jedoch seit Jahren nichts mehr in .NET gemacht, daher weiß ich nicht, was heutzutage als die richtige Vorgehensweise angesehen wird.
tdammers

12

Wie bereits erwähnt, besteht eine Lösung darin, das Build-System so zu konfigurieren, dass es verschiedene Editionen unterstützt.

Ich würde auch erwägen, es als Feature-Toggles zu implementieren und eine Konfigurationsdatei zu verwenden. Je weniger Sie bauen müssen, desto besser.

Schauen Sie sich diese Seite an.


3

Ich würde denken, dass das eine gute Idee ist, vorausgesetzt, Sie können es nicht innerhalb eines Zweigs tun, ohne den Code zu sehr zu gruppieren.
Ich würde es vorziehen, in der Lage zu sein, es in einem Zweig zu behalten und lokalisierte und Konfigurationsdateien zu verwenden, besonders wenn Sie sagen, dass die Unterschiede gering sind.
Ein anderer Weg könnten verschiedene Builds sein, zum Beispiel packt Ihre Build-Datei verschiedene Dateien für verschiedene Kunden, aber ich kann auch sehen, wie das Build-Tool verschiedene Zweige auscheckt. Da du git verwendest, würde ich sagen, dass es keine echten Fallstricke gibt. Eine Verzweigungsstrategie könnte darin bestehen, für verschiedene Aufgaben unterschiedliche Verzweigungen zu entwickeln, sich in der Master-Verzweigung einzuchecken und von Master zu EditionX und Y zu verschmelzen.


2

Das klingt eher nach einem Job für verschiedene Build-Konfigurationen. Die Antwort von Thiton geht in diese Richtung, aber ich würde es viel weiter nehmen als #ifdef:

Verwenden Sie verschiedene Erstellungsziele, um verschiedene Editionen der Software zu erstellen. Zielvorgaben können von abweichen

  • die Konfiguration, die sie enthalten,
  • die darin enthaltenen Objekt- oder Quelldateien oder
  • die Vorverarbeitung des Quellcodes.

Diese Vorverarbeitung kann natürlich den klassischen C-Präprozessor enthalten, kann aber auch die Verwendung eines benutzerdefinierten Präprozessors, einer Vorlagen-Engine zum Erstellen benutzerdefinierter Ansichten, umfassen.

Auf diese Weise müssen Sie nicht jede Änderung aktiv in mehrere Zweige verschieben, was gegen DRY verstößt (natürlich kann dies auch automatisiert werden, aber ich sehe keinen Vorteil).


1

Ich würde Zweige nur für signifikante Änderungen verwenden, andernfalls würden Sie am Ende jede kleine Änderung zu zahlreichen Zweigen hinzufügen, was überhaupt keinen Spaß macht und sehr fehleranfällig ist, insbesondere, wenn Sie mit mehr Leuten arbeiten.


1

Wenn Sie sie alle als unterschiedliche Produkte veröffentlichen, wird empfohlen, mehrere Niederlassungen zu haben. Wenn nicht, ist es dennoch empfehlenswert, so etwas wie einen Stamm oder einen Hauptzweig zu verwenden.

Ich denke auch, dass dies von Ihrem Entwicklungsprozess abhängt, insbesondere von der Bereitstellung. Wenn Sie über einen Prozess verfügen, mit dem nur ein Zweig in die Produktion eingeführt werden kann, und Zweige als "inkrementelle Builds" behandelt werden, kann Release B nicht in die Produktion eingeführt werden, es sei denn, Release A wurde zuerst eingeführt, da alle Änderungen von A ist bereits in B, dann sind mehrere Zweige der richtige Weg. Dies funktioniert, wenn Sie Teams auf der ganzen Welt haben und die Änderungen normalerweise nach Priorität sortiert sind.


-2

Die Lösung mit den drei verschiedenen Branchen (für Produktion, Entwicklung und Features) funktioniert wirklich gut. Nehmen wir an, Sie entdecken einen Fehler in Ihrem Produktionscode, dann können Sie einen Patch darauf anwenden und ihn dann freigeben. Stellen Sie nur sicher, dass Sie keine Funktionserweiterungen für den Produktionszweig oder größere Änderungen am Produktionszweig vornehmen. Sie und Ihr Team müssen sich selbst disziplinieren, um Ihrer Produktionsbranche keine wesentlichen Funktionsänderungen hinzuzufügen. Der Produktionszweig sollte nur kleinere Fehlerkorrekturen enthalten, die keine wesentlichen Änderungen in Ihrer Produktionscodebasis garantieren.


1
Das OP fragt nach verschiedenen Branchen für Varianten des einzelnen Produkts, nicht nach der Entwicklung separater Funktionen usw.
ein Lebenslauf vom
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.