Ich würde gerne wissen, ob es Sinn macht, das Projekt, an dem ich arbeite, in zwei Repositories anstatt in eines zu unterteilen.
Soweit ich sagen kann:
- Frontend wird in html + js geschrieben
- Backend in .net
- Das Backend ist nicht vom Frontend abhängig und das Frontend ist nicht vom Backend abhängig
- Das Frontend verwendet eine im Backend implementierte "Restful API".
- Das Frontend kann auf einem beliebigen statischen http-Server gehostet werden.
Das Repository hat ab sofort folgende Struktur:
Wurzel:
- Vorderes Ende/*
- Backend / *
Ich halte es für einen Fehler, beide Projekte im selben Repository zu belassen. Da beide Projekte keine Abhängigkeiten untereinander aufweisen, sollten sie in einzelne Repositorys und bei Bedarf in ein übergeordnetes Repository mit Submodulen gehören.
Mir wurde gesagt, dass es sinnlos ist und wir keinen Nutzen daraus ziehen werden.
Hier sind einige meiner Argumente:
- Wir haben zwei Module, die nicht voneinander abhängig sind.
- Langfristig kann es schwierig sein, die Quellhistorie beider Projekte zu haben (versuchen Sie, in der Historie nach etwas im Frontend zu suchen, während Sie die Hälfte der Commits haben, die überhaupt nichts mit dem gesuchten Fehler zu tun haben).
- Konflikt und Zusammenführung (Dies sollte nicht passieren, aber wenn jemand auf das Backend pusht, werden andere Entwickler gezwungen, Änderungen am Backend zu übernehmen, um Änderungen am Frontend zu pushen.)
- Ein Entwickler arbeitet möglicherweise nur am Backend, muss aber immer das Frontend ziehen oder umgekehrt.
- Auf lange Sicht, wenn es Zeit ist, bereitzustellen. In gewisser Weise könnte das Frontend auf mehreren statischen Servern bereitgestellt werden, während ein Backend-Server vorhanden ist. In jedem Fall werden die Benutzer gezwungen sein, entweder das gesamte Backend damit zu klonen oder ein benutzerdefiniertes Skript zu erstellen, um nur das Frontend auf alle Server zu pushen oder das Backend zu entfernen. Es ist einfacher, nur das Frontend oder das Backend zu schieben / ziehen als beide, wenn nur eines benötigt wird.
- Gegenargument (Eine Person könnte an beiden Projekten arbeiten), Erstellen Sie ein drittes Repo mit Submodul und entwickeln Sie damit. Die Historie wird in einzelnen Modulen getrennt gehalten und Sie können jederzeit Tags erstellen, bei denen die Version des Backends / Frontends wirklich synchron zusammenarbeitet. Wenn beide Frontends / Backends in einem Repo zusammengefasst sind, bedeutet dies nicht, dass sie zusammenarbeiten. Es verschmilzt einfach beide Geschichten zu einem großen Repo.
- Wenn Sie Frontend / Backend als Submodule verwenden, wird dies einfacher, wenn Sie dem Projekt einen Freiberufler hinzufügen möchten. In einigen Fällen möchten Sie nicht wirklich vollen Zugriff auf die Codebasis gewähren. Ein einziges großes Modul erschwert die Arbeit, wenn Sie einschränken möchten, was "Außenstehende" sehen / bearbeiten können.
- Fehlerbeschreibung und Fehlerbehebung: Ich habe einen neuen Fehler in das Frontend eingefügt. Dann hat jemand einen Fehler im Backend behoben. Mit einem einzigen Repository wird durch das Zurücksetzen vor dem neuen Fehler auch das Backend zurückgesetzt, was die Behebung erschweren könnte. Ich müsste das Backend in einen anderen Ordner klonen, damit das Backend funktioniert, während ich den Fehler im Frontend behebe ... und dann versuche, die Dinge neu zu ordnen ... Wenn zwei Repositorys vorhanden sind, ist es schmerzlos, den HEAD eines Repos zu verschieben den anderen nicht ändern. Und das Testen mit verschiedenen Versionen des Backends wird schmerzlos sein.
Kann mir jemand mehr Argumente geben, um sie zu überzeugen, oder zumindest sagen, warum es sinnlos (komplizierter) ist, das Projekt in zwei Teilmodule zu unterteilen. Das Projekt ist neu und die Codebasis ist ein paar Tage alt, so dass es nicht zu früh ist, es zu beheben.
quelle
Einige Ihrer Argumente sind gültig und andere nicht.
Das ist eigentlich nicht ganz richtig. Sowohl das Front-End als auch das Back-End müssen eine gemeinsame Schnittstelle haben, um kommunizieren zu können (Beschreibung). Das macht es zu einem schwachen Argument, beide in einem gemeinsamen Repository zu haben. Aber nur ein schwaches Argument, da es keinen großen Unterschied macht.
Dies ist ein falsches Argument. Wenn Sie nachsehen möchten, wie ein bestimmter Fehler behoben wurde, sehen Sie im Bug-Tracker nach, für den Commit den Fix enthält. Und wenn Sie wissen möchten, wie sich ein bestimmter Code entwickelt hat, sehen Sie sich den Verlauf einer einzelnen Datei (oder höchstens einer Handvoll) an. In beiden Fällen sollten andere Dateien, möglicherweise von anderen Modulen, im Repository keine Komplikationen verursachen.
Dies ist ein falsches Argument. Mir ist kein (halbwegs anständiges) VCS bekannt, bei dem Sie das gesamte Repository synchronisieren müssen, bevor Sie Ihre Änderungen festschreiben / pushen können. Sie müssen höchstens die Ordner synchronisieren, die die geänderten Dateien enthalten (und oft nur die Dateien selbst).
Dies ist das gleiche falsche Argument wie das vorherige.
Je nachdem, wie die Leute sich die Bereitstellung vorstellen, kann dies ein gültiges Argument sein. Wenn die Bereitstellung durch Entpacken einer Zip-Datei / eines Tarbals auf dem Server erfolgt, spielt es keine Rolle, wie Ihre Repositorys organisiert sind. Wenn die Bereitstellung durch Auschecken (eines Teils) eines Repositorys auf dem Server erfolgt, empfiehlt es sich, separate Repositorys für Module zu verwenden, die separat bereitgestellt werden.
Dies ist ein gültiges Argument, aber es ist nicht so stark.
Dies ist ein gültiges Argument.
Das ist ein falsches Argument, denn es würde bedeuten, dass Sie nach zwei Bugfixes für ein Modul das erste nicht zurücksetzen können. Mit einem halbwegs vernünftigen VCS können Sie fast alle alten Festschreibungen rückgängig machen (obwohl dies häufig bedeutet, dass Sie eine neue Festschreibung durchführen, mit der diese Änderungen rückgängig gemacht werden, manchmal sogar für die oberste Stufe von HEAD).
Dies ist eigentlich ein ziemlich gutes Argument. Durch die Verwendung von zwei Repositorys ist es einfacher, die Szenarien zu testen, in denen das bereitgestellte Front-End und Back-End möglicherweise (leicht) nicht mehr synchron sind.
quelle
Dieser Beitrag ist ein bisschen alt, aber ich möchte dazu beitragen. Während Ihr Back-End nicht wirklich über das Front-End Bescheid weiß, muss das Front-End Anforderungen haben, die mit der API des Back-End übereinstimmen. Wenn Sie Ihr Back-End als REST-API betrachten, können Sie eine Schnittstellendatei definieren, z. B. eine Swagger-YAML-Schnittstelle. Jetzt gibt es wirklich 3 Projekte, die Sie nach Belieben in verschiedene Repos aufteilen können:
Die API-Definition ist eine Abhängigkeit in den beiden anderen Projekten. Nehmen wir an, Sie haben maven als Abhängigkeits-Injection-Tool verwendet. Dann kommt es darauf an, wie streng Sie die Versionierung durchführen möchten. Sie können die Version des API-Definitionsprojekts jedes Mal aktualisieren, wenn Sie Änderungen vornehmen, um sicherzustellen, dass die Projekte immer in einem kompatiblen Zustand sind, jedoch einen höheren Overhead erfordern, oder Sie können SNAPSHOTS in maven verwenden und die Versionierung erst dann durchführen, wenn Sie dies tun Ich bin mit der Schnittstelle zufrieden, die weniger Overhead erfordert, aber es kann sein, dass Sie häufig Inkompatibilitäten haben. Solange Sie jedoch die API-Definition in Ihrem Front- und Back-End erzwingen, können Sie die Projekte in verschiedene Repositorys aufteilen.
In diesen Problemen geht es eher um das Verwalten von Abhängigkeiten. Selbst wenn die Projekte nicht aufgeteilt sind und sich im selben Repository befinden, ist es ziemlich einfach, die Website in einen Zustand zu versetzen, in dem das Front-End und das Back-End nicht synchron sind. Die einzige Möglichkeit, dies zu stoppen, besteht darin, den Vertrag zwischen beiden zu definieren. Sie möchten dies jedoch auf eine Weise tun, die die Implementierungen von Front-End und Back-End nicht miteinander verbindet, so als würden Sie stattdessen auf eine Schnittstelle programmieren einer Implementierung in der OO-Programmierung.
Um der Kritik, dass dies einen Mehraufwand für die Verwaltung dieser Schnittstellendatei verursacht, vorbeugend begegnen zu können, kann swagger beispielsweise sogar Code-Stubs für verschiedene Programmiersprachen und Frameworks wie JAX-RS erstellen. Sie können also eine Schnittstelle in der von Ihnen gewählten Technologie erstellen und diese Schnittstelle dann implementieren. Es fügt Ihrem Back-End auch eine sehr schöne Dokumentation hinzu, die es den Front-End-Entwicklern erleichtert, ihre Arbeit zu erledigen.
quelle