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.
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.
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.
[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"3.14.2def main():
print("Kaart klaar.")
return 0import 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"])map-kit 0.1.0
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 --offlineMet 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.
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.
[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"3.14.2def main():
print("Kaart klaar.")
return 0import 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)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.
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.
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.
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.
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.
Hierna onderzoek je wanneer de standaardbibliotheek voldoende is en wanneer een project een afhankelijkheid nodig heeft.
Deze les gebruikt Python-tools. Log in om de opdrachten uit te voeren →
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.