Quando un nuovo sviluppatore si unisce al team o Jenkins esegue una build completa, ho bisogno di creare un nuovo virtualenv. Trovo spesso che impostare un virtualenv con Pip e un numero elevato (più di 10) di requisiti richieda molto tempo per installare tutto da PyPI. Spesso viene a mancare del tutto con:PyPI è lento. Come posso gestire il mio 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
Sono consapevole di --use-mirrors
la bandiera di Pip, ea volte la gente nella mia squadra ho lavorato intorno utilizzando --index-url http://f.pypi.python.org/simple
(o un altro specchio) fino a quando non hanno uno specchio che risponde in modo tempestivo moda. Siamo nel Regno Unito, ma in Germania esiste uno specchio PyPI e non abbiamo problemi a scaricare dati da altri siti.
Quindi, sto cercando di rispecchiare PyPI internamente per il nostro team.
Le opzioni che ho guardato sono:
esecuzione il mio esempio PyPI. C'è l'attuazione PyPI ufficiale: CheeseShop così come diverse implementazioni di terze parti, come ad esempio: djangopypi e pypiserver (vedi nota in calce)
Il problema di questo approccio è che io non sono interessato a piena funzionalità PyPI con upload di file, ho voglio solo rispecchiare il contenuto che fornisce.
Esecuzione di un mirror PyPI con pep381client o pypi-mirror.
Sembra che funzioni, ma richiede che il mio mirror scarichi prima tutto da PyPI. Ho impostato un'istanza di prova di pep381client, ma la velocità di download varia tra 5 Kb/se 200 Kb/s (bit, non byte). A meno che non ci sia una copia dell'intero archivio PyPI da qualche parte, ci vorranno settimane per avere un utile mirror.
Utilizzo di un proxy round-robin PyPI come yopypi.
Questo è irrilevante ora che lo http://pypi.python.org è costituito da several geographically distinct servers.
Copia su una virtualenv tra gli sviluppatori o l'hosting di folder of the current project's dependencies.
Questo non è scalabile: abbiamo diversi diversi progetti Python le cui dipendenze cambiano (lentamente) nel tempo. Non appena le dipendenze di qualsiasi progetto cambiano, questa cartella centrale deve essere aggiornata per aggiungere le nuove dipendenze. Copiare virtualenv è peggio che copiare i pacchetti, dato che tutti i pacchetti Python con i moduli C devono essere compilati per il sistema di destinazione. Il nostro team ha utenti sia Linux che OS X.
(Questo appare ancora come la migliore opzione di un cattivo gruppo.)
L'utilizzo di un intelligente delega PyPI caching: collective.eggproxy
Questo mi sembra che sarebbe una soluzione molto buona, ma the last version on PyPI is dated 2009 e discute mod_python.
Cosa fanno altri grandi team Python? Qual è la soluzione migliore per installare rapidamente lo stesso set di pacchetti Python?
Note:
- ho visto la questione How to roll my own PyPI?, ma quella domanda si riferisce ad ospitare il codice privato.
- Il Python wiki lists alternative PyPI implementations
- Ho anche recentemente scoperto Crate.io ma non credo che mi aiuta quando si utilizza Pip.
- C'è un sito web di monitoraggio PyPI mirror status
- Some packages on PyPI have their files hosted elsewhere quindi, anche uno specchio perfetto non aiuterà tutte le dipendenze
Personalmente, quando ero in una situazione in cui avevo bisogno di scrivere la creazione (ripetuta) di un virtualenv, ho appena creato file .egg per i pacchetti che volevo e li ho controllati nel repository insieme allo script per creare il virtualenv. Non pretendo di far parte del grande team Python, comunque. – FatalError