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.toml
Die Datei
pyproject.toml
enthält einenscripts
-Einstiegspunktmyapp:main
:[project.scripts] myapp = "myapp:main"
myapp/src/myapp/__init__.py
Das Modul definiert eine CLI-Funktion
main()
:def main() -> None: print("Hello from myapp!")
Sie kann mit
uv run
aufgerufen 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.scripts
ausfü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.
--frozen
lässt die
uv.lock
-Datei unverändert.--no-sync
vermeidet die Aktualisierung der Umgebung während
uv run
-Aufrufen.--locked
stellt 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 --upgrade
aktualisiert alle Pakete.
uv lock --upgrade-package PACKAGE==VERSION
aktualisiert 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'",
]