Wenn ein neuer Entwickler dem Team beitritt oder Jenkins einen kompletten Build ausführt, muss ich einen neuen virtualenv erstellen. Ich finde oft, dass die Einrichtung eines virtualenv mit Pip und einer großen Anzahl (mehr als 10) von Anforderungen sehr lange dauert, um alles von PyPI zu installieren. Oft scheitert es zusammen mit:PyPI ist langsam. Wie betreibe ich meinen eigenen Server?
Downloading/unpacking Django==1.4.5 (from -r requirements.pip (line 1))
Exception:
Traceback (most recent call last):
File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/basecommand.py", line 107, in main
status = self.run(options, args)
File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/commands/install.py", line 256, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1018, in prepare_files
self.unpack_url(url, location, self.is_download)
File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1142, in unpack_url
retval = unpack_http_url(link, location, self.download_cache, self.download_dir)
File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 463, in unpack_http_url
download_hash = _download_url(resp, link, temp_location)
File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 380, in _download_url
chunk = resp.read(4096)
File "/usr/lib64/python2.6/socket.py", line 353, in read
data = self._sock.recv(left)
File "/usr/lib64/python2.6/httplib.py", line 538, in read
s = self.fp.read(amt)
File "/usr/lib64/python2.6/socket.py", line 353, in read
data = self._sock.recv(left)
timeout: timed out
Ich bin mir dessen bewusst --use-mirrors
Flagge Pip, und manchmal Leute in meinem Team haben um unter Verwendung --index-url http://f.pypi.python.org/simple
(oder einen anderen Spiegel) gearbeitet, bis sie einen Spiegel haben, die in angemessener Zeit reagiert Mode. Wir sind in Großbritannien, aber in Deutschland gibt es einen PyPI-Spiegel, und wir haben keine Probleme, Daten von anderen Seiten herunterzuladen.
Also, ich suche nach Möglichkeiten, PyPI intern für unser Team zu spiegeln.
Die Optionen, die ich angeschaut habe, sind:
Laufen meine eigene PyPI Instanz. Es ist die offizielle PyPI Umsetzung: CheeseShop sowie mehrere Drittanbieter-Implementierungen, wie zB: djangopypi und pypiserver (siehe Fußnote)
Das Problem bei diesem Ansatz ist, dass ich mit Datei-Upload in voller PyPI Funktionalität interessiert mich nicht, ich Ich möchte nur den Inhalt spiegeln, den es bietet.
Ausführen eines PyPI-Spiegels mit pep381client oder pypi-mirror.
Das sieht so aus, als könnte es funktionieren, aber es erfordert, dass mein Spiegel zuerst alles von PyPI herunterlädt. Ich habe eine Testinstanz von pep381client eingerichtet, aber meine Downloadgeschwindigkeit variiert zwischen 5 Kb/s und 200 Kb/s (Bits, nicht Bytes). Wenn es nicht irgendwo eine Kopie des vollständigen PyPI-Archivs gibt, brauche ich wochenlang einen nützlichen Spiegel.
Verwenden eines PyPI Round-Robin-Proxys wie yopypi.
Dies ist jetzt irrelevant, dass http://pypi.python.org selbst besteht aus several geographically distinct servers.
Copying um eine virtualenv zwischen den Entwicklern oder Hosting folder of the current project's dependencies.
Dies skaliert nicht: Wir haben verschiedene Python-Projekte, deren Abhängigkeiten sich (langsam) im Laufe der Zeit ändern. Sobald sich die Abhängigkeiten eines Projekts ändern, muss dieser zentrale Ordner aktualisiert werden, um die neuen Abhängigkeiten hinzuzufügen. Das Kopieren des Virtualenv ist schlimmer als das Kopieren der Pakete, da alle Python-Pakete mit C-Modulen für das Zielsystem kompiliert werden müssen. Unser Team hat sowohl Linux- als auch OS X-Benutzer.
(Das sieht immer noch wie die beste Wahl eines schlechten Haufen.)
ein intelligentes PyPI Caching Proxy mit: collective.eggproxy
Dies scheint, wie es eine sehr gute Lösung sein würde, aber the last version on PyPI is dated 2009 und diskutiert mod_python.
Was machen andere große Python-Teams? Was ist die beste Lösung, um den gleichen Satz von Python-Paketen schnell zu installieren?
Fußnoten:
- Ich habe die How to roll my own PyPI? Frage gesehen, aber diese Frage bezieht sich auf privaten Code-Hosting.
- Der Python Wiki lists alternative PyPI implementations
- Ich habe auch vor kurzem entdeckt Crate.io aber ich glaube nicht, dass mir hilft, wenn Pip verwenden.
- Es gibt eine Webseite PyPI mirror status
- Some packages on PyPI have their files hosted elsewhere so auch ein perfekter Spiegel alle Abhängigkeiten
Persönlich, als ich in einer Situation war, in der ich die (wiederholte) Erstellung eines virtualenv skripten musste, baute ich einfach .egg-Dateien für die Pakete, die ich wollte, und überprüfte sie zusammen mit dem Skript, um den virtualenv zu erstellen. Ich behaupte jedoch nicht, Teil eines großen Python-Teams zu sein. – FatalError