18 Punkte von darjeeling 2025-11-09 | 1 Kommentare | Auf WhatsApp teilen

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.

  1. Geteilte Abhängigkeiten und eine einzige virtuelle Umgebung

    • In der Datei pyproject.toml im Projekt-Root können gemeinsame Abhängigkeiten definiert werden.
    • Wird der Befehl uv sync ausgefü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.
  2. Code-Sharing über interne Pakete

    • Doppelt vorhandener gemeinsamer Code (z. B. die Funktion fetch_headlines) kann in ein separates „internes Paket“ wie core ausgelagert 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_headlines per import wiederverwenden.

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.toml hinzugefügt.
  • Individuelle Abhängigkeiten: Abhängigkeiten, die nur eine bestimmte App verwendet (z. B. fastapi, uvicorn), werden in die pyproject.toml der jeweiligen App eingetragen (z. B. packages/api/pyproject.toml).
  • Wenn im Root-Ordner uv sync ausgeführt wird, scannt UV alle pyproject.toml-Dateien und installiert alle benötigten Abhängigkeiten in der virtuellen Umgebung im Root.

Schritt 3: Code über interne Pakete teilen

  1. Erstellen Sie ein neues Paket (Ordner) für den gemeinsam genutzten Code, etwa packages/core.
  2. Fügen Sie dieses Paket in der Root-pyproject.toml wie eine normale Abhängigkeit hinzu.
  3. Ergänzen Sie in der Root-pyproject.toml den Abschnitt [tool.uv.sources], damit das Paket core nicht über PyPI, sondern innerhalb des Workspace gefunden wird.
<!-- end list -->
[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 }  
  1. Führen Sie uv sync erneut aus; dann wird das Paket core aus der lokalen Quelle installiert.
  2. Anschließend kann in packages/api oder packages/cli der gemeinsame Code mit from 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

 
pcj9024 2025-11-10

Das wirkt ziemlich ähnlich zu pnpm.