Apps¶
App-Projekte sind für Webserver, Skripte und Befehlszeilenschnittstellen
(CLI) geeignet. Auch sie können wir mit
uv init --package erstellen:
$ uv init --package myapp
tree myapp -a
myapp
├── .git
│ └── ...
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
└── myapp
└── __init__.py
myapp/pyproject.tomlDie Datei
pyproject.tomlenthält einenscripts-Einstiegspunktmyapp:main:myapp/pyproject.toml¶[project.scripts] myapp = "myapp:main"
myapp/src/myapp/__init__.pyDas Modul definiert eine CLI-Funktion
main():myapp/src/myapp/__init__.py¶def main() -> None: print("Hello from myapp!")
Sie kann mit
uv runaufgerufen werden:$ uv run mypapp Hello from myapp!
Alternativ könnt ihr auch eine virtuelle Umgebung bauen und dann
main()aus Python heraus aufrufen:$ uv add --dev . Resolved 1 package in 1ms Audited in 0.01ms >>> import myapp >>> myapp.main() Hello from myapp!
Bemerkung
Ich bin der festen Überzeugung, dass eine Python-Anwendung richtig gepackt sein sollte, um die vielen Vorteile zu genießen, wie z.B.:
die Ressourcenverwaltung mit importlib
mit
project.scriptsausführbare Skripte anstelle angehängterscripts-Ordnerdie Vorteile des
src-Layouts mit einer allgemeinen, dokumentierten und gut verstandenen Struktur.
uv.lock-Datei¶
Mit uv add --dev . wurde auch die uv.lock-Datei neben der
pyproject.toml-Datei erstellt. uv.lock ist ein
plattformübergreifendes Lockfile, das die Pakete erfasst, die über alle
möglichen Python-Merkmale wie Betriebssystem, Architektur und Python-Version
installiert werden sollen.
Im Gegensatz zur pyproject.toml, die die allgemeinen Anforderungen eures
Projekts spezifiziert, enthält uv.lock die genauen aufgelösten
Versionen, die in der Projektumgebung installiert sind. Diese Datei sollte in
die Versionskontrolle Git
eingecheckt werden, um konsistente und reproduzierbare Installationen auf
verschiedenen Rechnern zu ermöglichen.
version = 1
requires-python = ">=3.13"
[[package]]
name = "myapp"
version = "0.1.0"
source = { editable = "." }
[package.metadata]
[package.metadata.requires-dev]
dev = [{ name = "myapp", editable = "." }]
uv.lock ist eine für Menschen lesbare
TOML-Datei,
wird aber von uv verwaltet und sollte nicht manuell bearbeitet werden.
Bemerkung
Wenn uv in andere Tools oder Workflows integriert werden soll, könnt ihr
die Inhalte mit uv export --format requirements-txt >
CONSTRAINTS.TXT in das Requirements File Format
exportieren. Umgekehrt kann die erzeugte CONSTRAINTS.TXT-Datei dann
mit uv pip install oder anderen Tools verwendet werden.
Siehe auch
Aktualisieren von uv.lock¶
uv.lock wird regelmäßig beim Aufruf von uv sync und uv run
aktualisiert.
--frozenlässt die
uv.lock-Datei unverändert.--no-syncvermeidet die Aktualisierung der Umgebung während
uv run-Aufrufen.--lockedstellt sicher, dass das Lockfile mit den Projekt-Metadaten übereinstimmt. Wenn das Lockfile nicht aktuell ist, wird eine Fehlermeldung ausgegeben, anstatt das Lockfile zu aktualisieren.
Standardmässig bevorzugt uv bei der Ausführung von uv sync und
uv lock die gesperrten Versionen der Pakete. Paketversionen werden nur
geändert, wenn die Abhängigkeitsbedingungen des Projekts die vorherige,
gesperrte Version ausschließen.
uv lock --upgradeaktualisiert alle Pakete.
uv lock --upgrade-package PACKAGE==VERSIONaktualisiert ein einzelnes Paket auf eine bestimmte Version.
Ihr könnt auch mit dem
pre-commit-Framework regelmäßig
eure eure uv.lock-Datei aktualisieren:
- repo: https://github.com/astral-sh/uv-pre-commit
rev: 0.4.24
hooks:
- id: uv-lock
Plattform- und Python-Versionen einschränken¶
Wenn euerProjekt nur eine begrenzte Anzahl von Plattformen oder Python-Versionen
unterstützt, könnt ihr dies in der pyprojects.toml-Datei
PEP 508-konform tun, z.B. um die uv.lock-Datei
nur auf macOS und Linux einzuschränken:
[tool.uv]
environments = [
"sys_platform == 'darwin'",
"sys_platform == 'linux'",
]