Verwaltung eines Python-Monorepos mit UV Workspaces
(secondb.ai)Zusammenfassung zur Verwaltung eines Python-Monorepos mit UV Workspaces
Dieses Video zeigt, wie sich die Probleme, die bei der Verwaltung mehrerer Python-Anwendungen in einem einzigen Git-Repository (Monorepo) entstehen, mit der Funktion UV Workspaces sauber lösen lassen.
1. Zusammenfassung des Videos
Probleme
Wenn in einem Repository gleichzeitig ein CLI-Tool und eine FastAPI-App entwickelt werden, treten folgende Probleme auf.
- Code-Duplizierung: Gemeinsam genutzte Funktionen in CLI und API (z. B. eine Funktion zum Crawlen von Schlagzeilen) müssen per Copy-and-Paste übernommen werden.
- Komplexe Umgebungsverwaltung: Da für jede App eine eigene virtuelle Umgebung verwaltet werden muss, können Abhängigkeitsversionen kollidieren oder Speicherplatz verschwendet werden.
Lösung: UV Workspaces
UV Workspaces bietet zwei Kernfunktionen, um diese Probleme zu lösen.
-
Geteilte Abhängigkeiten und eine einzige virtuelle Umgebung
- In der Datei
pyproject.tomlim Projekt-Root können gemeinsame Abhängigkeiten definiert werden. - Wird der Befehl
uv syncausgeführt, liest UV diese Konfigurationsdatei und erstellt im Root-Ordner eine einzige virtuelle Umgebung (.venv), die im gesamten Repository gemeinsam genutzt wird. - Dadurch teilen sich alle Unterprojekte (CLI, API usw.) dieselbe Umgebung und dieselben Abhängigkeiten, was Versionskonflikte verhindert und die Verwaltung vereinfacht.
- In der Datei
-
Code-Sharing über interne Pakete
- Doppelt vorhandener gemeinsamer Code (z. B. die Funktion
fetch_headlines) kann in ein separates „internes Paket“ wiecoreausgelagert werden. - Über die Workspace-Konfiguration wird dieses
core-Paket als lokale Quelle statt über PyPI erkannt. - Danach können die CLI-App und die API-App diesen gemeinsamen Code mit
from core.news import fetch_headlinesperimportwiederverwenden.
- Doppelt vorhandener gemeinsamer Code (z. B. die Funktion
2. Verwendung von UV Workspaces
Schritt 1: Workspace einrichten
Erstellen Sie im Projekt-Root eine Datei pyproject.toml und definieren Sie den Abschnitt [tool.uv.workspace], um anzugeben, wo sich die Unterprojekte befinden.
[tool.uv.workspace]
# Alle Unterordner im Ordner "packages" als Workspace-Mitglieder erkennen
members = ["packages/*"]
Schritt 2: Abhängigkeiten verwalten
- Gemeinsame Abhängigkeiten: Abhängigkeiten, die von allen Projekten gemeinsam verwendet werden (z. B.
python-dotenv), werden zum Root-pyproject.tomlhinzugefügt. - Individuelle Abhängigkeiten: Abhängigkeiten, die nur eine bestimmte App verwendet (z. B.
fastapi,uvicorn), werden in diepyproject.tomlder jeweiligen App eingetragen (z. B.packages/api/pyproject.toml). - Wenn im Root-Ordner
uv syncausgeführt wird, scannt UV allepyproject.toml-Dateien und installiert alle benötigten Abhängigkeiten in der virtuellen Umgebung im Root.
Schritt 3: Code über interne Pakete teilen
- Erstellen Sie ein neues Paket (Ordner) für den gemeinsam genutzten Code, etwa
packages/core. - Fügen Sie dieses Paket in der Root-
pyproject.tomlwie eine normale Abhängigkeit hinzu. - Ergänzen Sie in der Root-
pyproject.tomlden Abschnitt[tool.uv.sources], damit das Paketcorenicht über PyPI, sondern innerhalb des Workspace gefunden wird.
[project]
# 1. Internes Paket als Abhängigkeit hinzufügen
dependencies = [
"core",
"python-dotenv"
]
# 2. Angeben, dass 'core' ein lokales Workspace-Paket ist
[tool.uv.sources]
core = { workspace = true }
- Führen Sie
uv syncerneut aus; dann wird das Paketcoreaus der lokalen Quelle installiert. - Anschließend kann in
packages/apioderpackages/clider gemeinsame Code mitfrom core.news import ...eingebunden werden.
Schritt 4: Projekte ausführen
Zum Ausführen eines bestimmten Projekts wird uv run --from <Paketname> verwendet.
# API-Server starten
uv run --from packages/api uvicorn main:app --reload
# CLI-Tool ausführen
uv run --from packages/cli python main.py
3. Für wen sich das empfiehlt
- Wenn mehrere kleine Automatisierungsskripte, Webhooks, APIs oder CLIs in einem einzigen Repository verwaltet werden.
- Besonders nützlich ist es, wenn diese Anwendungen gemeinsame Logik oder Abhängigkeiten teilen.
- Weniger geeignet kann es dagegen für einzelne Skripte, unabhängig über PyPI veröffentlichte Pakete oder vollständig voneinander unabhängige Apps sein.
Link zum Originalvideo: https://www.youtube.com/watch?v=N_ypJwV8Q8I
1 Kommentare
Das wirkt ziemlich ähnlich zu pnpm.