← Python/Modules en tooling
Les 6 van 8
MODULE 09 · 06◷ 35 min

Met uv vastleggen, installeren en uitvoeren

Na deze les kun je
  • Projectafspraken en een gegenereerde lockfile onderscheiden.
  • Het echte project in een omgeving synchroniseren.
  • Een verouderde lockfile herkennen zonder haar stilzwijgend te wijzigen.

Je collega gebruikt dezelfde projectbeschrijving, maar krijgt na een installatie andere pakketversies. Het gewenste bereik en de gekozen versies zijn verschillende afspraken. Leg de gemaakte keuzes vast en controleer ze voordat je een programma start.

Van afspraak naar vastgelegde keuze

Je kent pyproject.toml als beschrijving van het project. Een lockfile legt vast welke pakketversies en bronnen een gereedschap daarvoor heeft gekozen. Met uv schrijf je die gegevens naar uv.lock.

Je bewerkt de projectbeschrijving bewust; laat uv de lockfile genereren. Bewaar beide bestanden bij je broncode, zodat een collega dezelfde vastgelegde keuzes kan gebruiken. Een bestaande lockfile zegt nog niet dat de pakketten al in een omgeving geïnstalleerd zijn.

In deze oefening staat uv 0.13.6 klaar. Het kleine project trip-kit heeft geen externe uitvoerafhankelijkheden en de bouwbackend is al beschikbaar. Daardoor kunnen de werkelijke opdrachten met --offline werken, zonder pakketten te downloaden.

Het eerste voorbeeld gebruikt een ander project en leest de werkelijk gegenereerde lockfile. Zelfs zonder externe afhankelijkheden bevat die een record voor het eigen project. De uitvoer is dus afkomstig uit een bestand dat uv net geschreven heeft.

Het eigen project verschijnt in de werkelijk gegenereerde lockfile
pyproject.toml
[project]
name = "map-kit"
version = "0.1.0"
requires-python = ">=3.14,<3.15"
dependencies = []

[project.scripts]
map-report = "map_kit:main"

[build-system]
requires = ["uv_build==0.13.6"]
build-backend = "uv_build"
.python-version
3.14.2
src/map_kit/__init__.py
def main():
    print("Kaart klaar.")
    return 0
example.py
import subprocess
import tomllib
from pathlib import Path

subprocess.run(["uv", "--quiet", "lock", "--offline"], check=True)
locked = tomllib.loads(Path("uv.lock").read_text())
for package in locked["package"]:
    print(package["name"], package["version"])
Verwachte uitvoer
map-kit 0.1.0

De omgeving laten aansluiten

Synchroniseren betekent dat uv de projectomgeving laat aansluiten op de lockfile. uv sync --locked --offline maakt of gebruikt de omgeving en installeert hier ook het eigen project. De meegeleverde build-system-tabel vertelt hoe dat project gebouwd wordt.

De optie --locked vraagt om een actuele lockfile. Kloppen de projectafspraken er niet meer bij, dan stopt uv met een fout in plaats van de lockfile stilzwijgend bij te werken. Dat is bruikbaar wanneer je wilt controleren wat een collega heeft vastgelegd.

In de vorige les koos je zelf het interpreterpad. Hier beheert uv de omgeving bij het project. De meegeleverde .python-version noemt Python 3.14.2; die interpreter is in deze oefenomgeving al aanwezig.

uv lock --offline
uv sync --locked --offline

Het geïnstalleerde commando starten

Met uv run --locked --offline trip-report "$@" start je de meegeleverde console-ingang. Zonder --locked kan uv bij uitvoeren eerst opnieuw locken. Gebruik de optie hier bewust, zodat een ontbrekende of verouderde afspraak zichtbaar wordt.

De commandonaam komt uit project.scripts, dat je eerder hebt ingevuld. De tekst achter de dubbele punt verwijst naar een functie in het geïnstalleerde pakket. De ontvangen argumenten geef je net als in de venv-les met "$@" door.

Veelgemaakte fout: controleren door opnieuw te genereren

Na een projectwijziging is uv lock een opdracht om de keuzes opnieuw vast te leggen. Dat is niet hetzelfde als controleren of de oude lockfile nog past. Voor die controle gebruik je uv lock --check --offline.

Het tweede voorbeeld genereert eerst een geldige lockfile en verandert daarna de projectversie. De echte controle weigert vervolgens verder te gaan. Dat is nuttige feedback: beslis bewust of de projectwijziging klopt en genereer daarna zo nodig opnieuw.

De echte lockcontrole weigert een gewijzigde projectversie
pyproject.toml
[project]
name = "map-kit"
version = "0.1.0"
requires-python = ">=3.14,<3.15"
dependencies = []

[project.scripts]
map-report = "map_kit:main"

[build-system]
requires = ["uv_build==0.13.6"]
build-backend = "uv_build"
.python-version
3.14.2
src/map_kit/__init__.py
def main():
    print("Kaart klaar.")
    return 0
example.py
import subprocess
from pathlib import Path

subprocess.run(["uv", "--quiet", "lock", "--offline"], check=True)
project = Path("pyproject.toml")
project.write_text(project.read_text().replace('version = "0.1.0"', 'version = "0.2.0"'))
checked = subprocess.run(["uv", "--quiet", "lock", "--check", "--offline"])
raise SystemExit(checked.returncode)
Verwachte fout
lockfile

In de opdracht zijn de vier commandobestanden afzonderlijke stappen. De meegeleverde controle regelt de volgorde en probeert ook een verouderde projectbeschrijving. Zelf verzonnen uitvoer of altijd succes teruggeven vervangt die handelingen niet.

AAN DE SLAG 0/4
1

Een echte lockfile genereren

Zet in lock.sh uv lock --offline. Laat uv een leesbare uv.lock genereren met het eigen project trip-kit op versie 0.1.0. Een lege lockfile of een succesmelding volstaat niet.

2

Het eigen project vanuit de lockfile installeren

Zet in sync.sh uv sync --locked --offline. De controle voert lock.sh eerst uit. In .venv moet de distributie trip-kit 0.1.0 echt geïnstalleerd zijn. Bij een gewijzigde projectversie moet het synccommando falen zonder uv.lock te herschrijven.

3

De geïnstalleerde console-ingang gebruiken

Start in run.sh met uv run --locked --offline het commando trip-report en geef "$@" door. Verschillende namen/aantallen, inclusief een naam met spaties, moeten werken. Een gewijzigde projectversie moet een fout geven in plaats van de lockfile stilzwijgend bij te werken.

4

Een bestaande lockfile zonder wijzigen controleren

Zet in check.sh uv lock --check --offline. Bij de actuele projectbeschrijving eindigt dit normaal. Na wijziging van de projectversie moet het mislukken en moeten de bytes van uv.lock ongewijzigd blijven. Een altijd-goed of altijd-fout script is onvoldoende.

Onthoud dit

  • De projectbeschrijving en de gegenereerde lockfile hebben verschillende rollen.
  • Synchroniseren installeert de vastgelegde projectomgeving.
  • locked en check maken een verouderde afspraak zichtbaar.

Hierna onderzoek je wanneer de standaardbibliotheek voldoende is en wanneer een project een afhankelijkheid nodig heeft.

lock.sh

Deze les gebruikt Python-tools. Log in om de opdrachten uit te voeren →

UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.