UV_HTTP_TIMEOUT, UV_HTTP_RETRIES, UV_CONCURRENT_DOWNLOADS usw.). Vertiefung zu Git/Docker-Pulls: Git- & Docker-Pull-Leitfaden; grenzüberschreitende Spiegel insgesamt: Git/npm/Homebrew-Mirror-Matrix; Übersicht: Technik-Blog. Ergänzend auf Englisch (ohne Login): Remote Mac Git/Docker acceleration und cache strategy for CI pulls.
① Szenario: pip vs. uv vs. conda – wann uv?
Die Wahl hängt von Reproduzierbarkeit, Binärkompatibilität und dem Anteil an R-ähnlichen oder C++-Stacks ab. Nutzen Sie die folgende Kurzmatrix als Einstieg – nicht als Dogma, sondern als Abstimmungsgrundlage mit Security und Data-Science.
| Werkzeug | Stärken | Schwächen / Kosten | Typisch sinnvoll wenn |
|---|---|---|---|
| pip (+ venv) | Überall verfügbar, minimaler Lernaufwand | Langsamer Resolver bei großen Graphen; weniger integrierte Lock-Story als uv | Legacy-Skripte, sehr einfache Projekte |
| uv | Sehr schnelle Auflösung/Install, uv.lock, uv pip compile, starke CI-Automatisierung |
Team muss Lock-Workflow und Index-Politik kennen | CI mit vielen Wheels/sdist, grenzüberschreitenden Pulls, reproduzierbare Builds |
| conda/mamba | Binaries für wissenschaftlichen Stack, Umgebungsisolation | Kanal-Politik, größere Artefakte, andere Lock-Konzepte | Schwere numerische Stacks, gemischte Nicht-Python-Abhängigkeiten |
Empfehlung für Remote-Mac-CI 2026: Wenn Ihr Team primär PyPI-Metadaten nutzt und schnelle, wiederholbare Installs braucht, ist uv meist die bessere Hebelstelle als reines pip-Optimieren – vorausgesetzt, Sie committen ein uv.lock (oder ein per uv pip compile erzeugtes constraints-File) und setzen Index/Cache explizit.
② Ausführbare Parameter-Matrix (Parallelität, Timeout, Retry, Cache, Index)
Alle folgenden Variablen sind in der offiziellen uv-Umgebungsreferenz beschrieben. Werte sind Startpunkte für instabile WAN-Pfade; messen Sie auf Ihrem MacPull-Knoten nach.
| Ziel | Variable / CLI | Beispiel (instabiles WAN) | Risiko wenn zu extrem |
|---|---|---|---|
| Parallele Downloads | UV_CONCURRENT_DOWNLOADS |
8–16 testen; bei Proxy-429 reduzieren |
Mehr gleichzeitige TCP-Sessions → Jitter/Resets |
| HTTP-Lese-Timeout | UV_HTTP_TIMEOUT (= UV_REQUEST_TIMEOUT) |
120–300 (Sekunden) |
Hängende Jobs bei echten Totverbindungen |
| Connect-Timeout | UV_HTTP_CONNECT_TIMEOUT |
30–60 |
Lange Wartezeit vor Failover |
| Retries | UV_HTTP_RETRIES |
8–12 (Default oft 3) |
Gesamtlaufzeit steigt bei dauerhaftem Ausfall |
| Parallele sdist-Builds | UV_CONCURRENT_BUILDS |
2–4 auf M4 je nach RAM |
CPU/RAM-Spitzen, Xcode/CLT nötig |
| Offline-Cache-Pfad | UV_CACHE_DIR |
z. B. /var/ci/uv-cache/$CI_JOB_ID oder geteilter Pool-Pfad |
Cache-Vermischung ohne Strategie (siehe FAQ) |
| Primärer Index | UV_DEFAULT_INDEX (empfohlen) / UV_INDEX_URL |
URL Ihres PyPI-Spiegels (Simple API) | Sync-Verzug zum Kanonischen Index |
| Zusatz-Index | UV_INDEX (benannt) oder UV_EXTRA_INDEX_URL |
PyPI zusätzlich zum privaten Spiegel | Versionskonkurrenz → UV_INDEX_STRATEGY nur bewusst setzen |
Beispiel: Export vor dem Job (zsh/bash)
Spiegel-Wechsel im gleichen Runner (z. B. Fallback, wenn Healthcheck am Primärindex fehlschlägt):
Einzeiler-Installation aus Lock (Projekt mit pyproject.toml + uv.lock):
③ Grenzüberschreitendes Netz: typische Fehlerbilder & Kurz-Triage
| Symptom | Häufige Ursache | Maßnahme (kopierbar) |
|---|---|---|
SSL_CERTIFICATE_VERIFY_FAILED / TLS handshake error |
Fehlende Firmen-CA, anderer Trust Store als macOS-Keychain | export SSL_CERT_FILE=/pfad/zu/bundle.pem oder UV_NATIVE_TLS=true / UV_SYSTEM_CERTS=true (plattformnahe Stores nutzen) |
| Timeout mitten im Wheel-Download | Zu niedriges Lese-Timeout, instabile Route | UV_HTTP_TIMEOUT erhöhen + UV_HTTP_RETRIES; Parallelität senken |
| Proxy-Fehler / leere Antworten | HTTPS_PROXY ohne passende NO_PROXY-Ausnahmen |
export HTTPS_PROXY=http://proxy:8080 und export NO_PROXY=localhost,127.0.0.1,.intern.example |
| HTTP/2 oder Multiplex-Probleme hinter DPI | Manche Geräte brechen Multiplex ab | Testweise auf HTTP/1.1 erzwingen (Corporate-Proxy-Doku) oder anderen Egress-Pfad wählen |
Diagnose mit mehr Kontext:
Entspricht der Empfehlung, zuerst Zertifikats- und Proxy-Pfad zu klären, bevor Sie Index-URLs wahllos wechseln – sonst verschleiern Sie Compliance-relevante Abweichungen.
④ Konsistenz: uv.lock, pyproject.toml & reproduzierbare CI-Schritte
Grundregel: CI soll Auflösung nicht „nebenbei“ ändern. Nutzen Sie uv sync --frozen --locked oder setzen Sie UV_FROZEN=1 und UV_LOCKED=1, damit fehlende oder driftende Locks sofort auffallen.
| Artefakt | Rolle | CI-Check |
|---|---|---|
uv.lock |
Canonical Lock für uv-Projekte | uv sync --locked; im PR uv lock ausführen und git diff uv.lock prüfen |
requirements.txt + Hashes |
pip-kompatible Lieferung | uv pip sync requirements.txt mit UV_REQUIRE_HASHES=true wenn Hashes gepflegt |
uv pip compile-Output |
Constraints ohne vollständiges uv-Projekt | Compile-Schritt nur auf gepinntem Runner; Output committen |
Checkliste – reproduzierbare Pipeline auf Remote-Mac
- uv-Version pinnen (z. B. gleiche Binärversion im Image oder
curl -LsSf https://astral.sh/uv/install.sh | shmit festem Release-Tag in Ihrem Skript). - Python-Quelle festlegen:
UV_PYTHONoderuv python install 3.12einmalig cachen; bei Managed-Python ggf.UV_PYTHON_INSTALL_MIRRORfür grenzüberschreitende Builds. - Lock erzeugen am Referenz-Runner (gleiche Architektur wie Produktions-CI):
uv lock, dann Commit. - CI nur konsumieren:
uv sync --frozen --lockedoderuv run --locked …. - Integrität: Bei Bedarf
UV_REQUIRE_HASHES=truefür requirements mit PEP-503-Hashes. - Cache-Policy: Geteilter
UV_CACHE_DIRnur mit Quota unduv cache pruneim Wartungsfenster.
⑤ FAQ: Cache, Plattform-Wheels & private Indizes
- Cache-Verschmutzung zwischen Jobs?
- Pro Job
UV_CACHE_DIRmit eindeutigem Suffix oder geteilter Cache mit dokumentierter Bereinigung.uv sync --frozenverhindert stillen Lock-Drift im Job. - Wheel passt nicht zur Plattform?
- Tags prüfen (
macosx_*_arm64vs.x86_64). Lock mit passendem--python-platformerzeugen, wenn mehrere Runner-Typen existieren. - Privater Index + PyPI?
UV_DEFAULT_INDEXauf privat, zusätzlicher Index überUV_INDEX; Auth perUV_INDEX_*_USERNAME/UV_INDEX_*_PASSWORD.UV_INDEX_STRATEGY=unsafe-best-matchnur mit Security-Freigabe.
Fazit
Mit klarer uv-Parameter-Matrix, explizitem PyPI-Spiegel und striktem Lockfile-Konsum werden Batch-Installs auf Remote-Mac-Buildern deutlich planbarer. Wählen Sie einen Knoten in der Region, die Ihren Index-Pfad entlastet – auf der MacPull-Startseite und unter Preise sehen Sie ohne Anmeldung passende Pakete; Detailfragen zu SSH, Region und SLA klären Sie in der Hilfe. Für parallele Git- und Container-Pulls ergänzen Sie die oben verlinkten englischsprachigen Guides – gleiches Ökosystem, gleiche Zielsetzung: stabile Pulls statt Überraschungen in der CI.
Nächste Schritte – ohne Login
Tarife prüfen, Hilfe lesen; auf Englisch zusätzlich Git/Docker-Pull-Guides.