Sehr vorsichtig
Feature Branching ist eine Option, aber ich finde es etwas schwer. Darüber hinaus werden tiefgreifende Änderungen erleichtert, die dazu führen können, dass Ihre Anwendung nicht mehr funktioniert, wenn Sie nicht die Kontrolle behalten. Im Idealfall möchten Sie die Anpassungen so weit wie möglich vorantreiben, um Ihre Kerncodebasis so allgemein und allgemein wie möglich zu halten.
Hier ist, wie ich es tun würde, obwohl ich nicht weiß, ob es auf Ihre Codebasis ohne große Modifikationen und Umformulierungen anwendbar ist. Ich hatte ein ähnliches Projekt, bei dem die Grundfunktionalität identisch war, aber jeder Kunde einen sehr spezifischen Satz von Funktionen benötigte. Ich habe eine Reihe von Modulen und Containern erstellt, die ich dann durch Konfiguration (à la IoC) zusammenstelle.
dann habe ich für jeden Kunden ein Projekt erstellt, das im Wesentlichen die Konfigurationen und das Build-Skript enthält, um eine vollständig konfigurierte Installation für seine Site zu erstellen. Gelegentlich platziere ich dort auch einige für diesen Kunden maßgeschneiderte Komponenten. Dies ist jedoch selten und wenn immer möglich, versuche ich, es in einer allgemeineren Form zu erstellen und nach unten zu verschieben, damit andere Projekte sie verwenden können.
Das Endergebnis ist, dass ich die Anpassungsstufe habe, die ich benötige. Ich habe angepasste Installationsskripte, so dass ich beim Aufrufen des Kundenstandorts nicht die ganze Zeit über das System pfeife und als zusätzlichen SEHR signifikanten Bonus bekomme Regressionstests erstellen zu können, die direkt mit dem Build verknüpft sind. Auf diese Weise kann ich immer dann, wenn ich einen kundenspezifischen Fehler erhalte, einen Test schreiben, der das System während der Bereitstellung bestätigt und somit TDD auch auf dieser Ebene durchführen kann.
Also in Kürze:
- Stark modularisiertes System mit flacher Projektstruktur.
- Erstellen Sie ein Projekt für jedes Konfigurationsprofil (Kunde, obwohl mehrere ein Profil gemeinsam nutzen können)
- Stellen Sie die erforderlichen Funktionssätze als ein anderes Produkt zusammen und behandeln Sie sie als solches.
Bei ordnungsgemäßer Ausführung sollte Ihre Produktassembly bis auf einige Konfigurationsdateien alle enthalten.
Nachdem ich dies für eine Weile verwendet hatte, erstellte ich Metapakete, die die am häufigsten verwendeten oder wesentlichen Systeme als eine Kerneinheit zusammenfassten, und verwendete dieses Metapaket für Kundenassemblys. Nach ein paar Jahren hatte ich einen großen Werkzeugkasten, den ich sehr schnell zusammenbauen konnte, um Kundenlösungen zu erstellen. Ich bin gerade dabei, Spring Roo zu untersuchen und zu sehen, ob ich die Idee nicht ein bisschen weiter vorantreiben kann, in der Hoffnung, dass ich eines Tages mit dem Kunden in unserem ersten Interview einen ersten Entwurf des Systems erstellen kann Entwicklung ;-).
Hoffe das hat geholfen
#ifdef
für Sie?