Was brauchen Sie für einen Monorepo für eine große Codebasis?

7

Hätten Sie ab einer bestimmten Größe der Codebasis noch Git oder gibt es speziellere Lösungen?

(Auch um nur einen Teil der Codebasis auszuchecken)

Peter Muryshkin
quelle

Antworten:

5

Git funktioniert für Monorepos, hat aber einige Probleme:

  1. Sie müssen das gesamte Repo auschecken.
  2. Sie müssen den gesamten Verlauf abrufen (im Allgemeinen - flache Klone sind eine Option, aber normalerweise nicht nützlich für die eigentliche Entwicklungsarbeit).
  3. Von Haus aus hat jeder Lese- und Schreibzugriff auf jedes Verzeichnis, wenn er es überhaupt hat.

Google, wahrscheinlich der bekannteste Monorepo-Nutzer, hat Piper entwickelt , um seine Anforderungen zu erfüllen. Aber Sie sind nicht Google, und daher gehören ihre Lösungen wahrscheinlich nicht Ihnen.

Einer der Hauptvorteile eines Monorepo besteht darin, dass Sie global-atomare Änderungen vornehmen können (dh Sie müssen nicht viele Dinge versionieren, da Sie den Anrufer und den Angerufenen im selben Commit ändern können). Um dies zu ermöglichen, möchten Sie wirklich ein einheitliches Build-System haben, das Abhängigkeiten über das gesamte Repo hinweg verfolgt. Bazel ist eine Open-Source-Extraktion von Blaze, dem Build-System von Google, und versucht dies zu tun (obwohl es jung und unreif ist und viele Funktionen fehlen, die für die Verwendung durch Nicht-Google erforderlich sind). Pants ist ein ähnliches System von Twitter.

Wenn Sie bei einer solchen atomaren Änderung Tonnen von Code erstellen, möchten Sie wahrscheinlich auch eine Buildfarm, mit der Sie dies nicht auf Ihrem lokalen Computer tun können. Ebenso benötigen Sie ein leistungsstarkes CI-System, um Tests während des Updates ausführen zu können.

Xiong Chiamiov
quelle
4

Die Antwort lautet: ein bisschen von beidem. Um die Einschränkungen von "Use Git" und "Verwalten einer riesigen Codebasis" zu erfüllen, hat Microsoft ein neues Dateisystem entwickelt (zuvor wurde eine Perforce-Variante namens SourceDepot verwendet). Es ist Open Source, aber ich habe keine persönliche Erfahrung damit.

Warum willst du einen Monorepo? Der offensichtlichste Grund ist, dass Sie eine API und alle Aufrufer dieser API in einem atomaren Commit ändern können. Es hat auch Vorteile, eine git logSuche über die gesamte Codebasis durchführen zu können ...

Gaius
quelle
1

Es gibt unterschiedliche Meinungen darüber, was eine große Codebasis ist. Wenn Sie über ein Unternehmen mit 100 Ingenieuren sprechen, würde ich argumentieren, dass Git immer noch in der Lage sein sollte, damit umzugehen. Es wurde für die Anforderungen des Linux-Kernels entwickelt, der kein kleines Projekt für sich ist.

Unabhängig davon, wie Sie das Repository speichern, können Probleme auftreten. Wenn Sie beispielsweise an einer großen Java-Codebasis arbeiten und Tools wie Eclipse oder IntelliJ verwenden, verbrauchen diese mehr Speicher und werden im Allgemeinen langsamer.

Andererseits ist die Möglichkeit, den gesamten Code gleichzeitig zu bearbeiten (z. B. beim Anwenden von Refactoring oder Quellcode-Transformationen), einer der Hauptvorteile monolithischer Repositorys.

Wenn Sie nach einer speziellen Codegröße fragen, ob Sie spezielle Tools benötigen, lautet die Antwort Ja. Laut Google, das wohl die größte C ++ - Codebasis der Welt hat, haben alle verfügbaren Tools (Open Source oder kommerziell) ihre Anforderungen nicht erfüllt. Am Ende entwickelten sie ein internes System namens Piper:

Philipp Claßen
quelle
0

Wenn ich es richtig verstehe, ist das "Bedürfnis" nach einem Monorepo einfach das Grundbedürfnis eines einzelnen / kohärenten Versionsschemas, das auf ein Softwareprojekt angewendet wird, das mehrere lose verwandte Komponenten / Unterprojekte enthält, die auf andere Weise unabhängig voneinander verwaltet / versioniert werden könnten / könnten separate Repositorys.

Ähnlich, wenn Sie möchten, mit der Notwendigkeit, ein reguläres Quell-Repository zu verwenden, um ein einzelnes / kohärentes Versionsschema für eine Vielzahl von Quelldateien bereitzustellen, von denen jede ihren eigenen, unabhängigen Änderungsverlauf hat.

Die Verwendung einer tatsächlichen Monorepo-Lösung ist definitiv eine, aber meiner Meinung nach nicht die einzige Möglichkeit, diesen Bedarf zu decken.

Ein anderer möglicher Ansatz ist die Verwendung eines Umbrella-Projekt-Repositorys, das eine oder mehrere Manifest-Dateien mit der genauen Version der einzelnen Projektkomponenten-Repositorys enthält.

Selbst wenn die Versionen der Komponenten-Repositorys durch unabhängige, nicht atomare Commits geändert werden, kann das Projekt selbst kohärent verwaltet werden, indem alle zugehörigen Versionsänderungen des Komponenten-Repositorys zu einem einzigen Commit für die Manifest-Datei (en) im Umbrella-Repository zusammengefasst werden.

Ein solcher Ansatz hat mehrere Vorteile gegenüber der Migration auf eine tatsächliche Monorepo-Lösung:

  • Die vorhandenen Komponenten-Repositorys müssen nicht geändert werden
  • kann Mischungen von Komponenten mit unterschiedlichen Repository-Technologien unterstützen
  • Jedes Komponenten-Repository kann weiterhin unabhängig entwickelt und verwaltet werden
  • Das Hinzufügen / Löschen von Projektkomponenten ist fast trivial
  • Die Integration von Komponenten von Drittanbietern (Upstream) ist viel einfacher
  • Die Projekthistorie kann viel sauberer gehalten werden und nicht mit allen Details jeder einzelnen Änderung des Komponenten-Repositorys verschmutzt werden (was normalerweise für die anderen Komponenten irrelevant ist).
  • Die Lösung selbst ist in hohem Maße skalierbar, da Sie sich keine Gedanken über Größe, Leistung und Skalierbarkeit eines einzelnen Repositorys machen müssen.
Dan Cornilescu
quelle