PyPI est lente. Comment puis-je utiliser mon propre serveur?
Lorsqu'un nouveau développeur a rejoint l'équipe, ou Jenkins exécute une construction complète, j'ai besoin de créer une nouvelle virtualenv. Je trouve souvent que la mise en place d'un virtualenv avec Pip et un grand nombre (plus de 10) des exigences prend un temps très long pour tout installer à partir de PyPI.
Souvent, il ne parvient pas tout à fait avec:
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
Je suis conscient de Pep --use-mirrors
drapeau, et parfois, les gens de mon équipe ont travaillé autour en utilisant --index-url http://f.pypi.python.org/simple
(ou un autre miroir) jusqu'à ce qu'ils ont un miroir qui répond en temps opportun. Nous sommes dans le royaume-UNI, mais il y a un PyPI miroir en Allemagne, et nous n'avons pas de problèmes de téléchargement de données à partir d'autres sites.
Donc, je suis à la recherche des moyens de miroir PyPI en interne pour notre équipe.
Les options que j'ai regardé sont:
-
Mon propre PyPI instance. Il y a l'officiel PyPI mise en œuvre: CheeseShop ainsi que plusieurs tiers des mises en œuvre, telles que: djangopypi et pypiserver (voir note de bas de page)
Le problème avec cette approche est que je ne suis pas intéressé à plein PyPI à la fonctionnalité de téléchargement de fichier, je veux juste mettre en miroir le contenu qu'il fournit.
-
De l'exécution d'un PyPI miroir avec pep381client ou pypi-miroir.
Cela ressemble à cela pourrait fonctionner, mais il nécessite de mon miroir de téléchargement tout de PyPI premier. J'ai mis en place une instance de test pep381client, mais ma vitesse de téléchargement varie entre 5 Ko/s et 200 Ko/s (bits, pas d'octets). Sauf si il y a une copie de l'intégralité du PyPI archive quelque part, il va me prendre des semaines pour avoir une durée de miroir.
-
À l'aide d'un PyPI round-robin proxy comme yopypi.
C'est sans importance maintenant que http://pypi.python.org lui-même se compose de plusieurs géographiquement distincts serveurs.
-
Copie autour d'un virtualenv entre les développeurs, ou d'organiser un dossier du projet en cours de dépendances.
Ce n'est pas à l'échelle: nous avons différentes Python projets dont les dépendances de changement (lentement) au fil du temps. Dès que les dépendances de tout projet de changement, de centre, le dossier doit être mis à jour pour ajouter les nouvelles dépendances. La copie de la virtualenv est pire que de copier les paquets, mais, depuis n'importe quel paquet Python avec C les modules doivent être compilées pour le système cible. Notre équipe a à la fois Linux et OS X, les utilisateurs.
(Ce qui semble encore la meilleure option d'un mauvais groupe.)
-
À l'aide d'un intelligent PyPI la mise en cache proxy: collective.eggproxy
Il semble que ce serait une très bonne solution, mais la dernière version sur PyPI est datée de 2009 et discute avec mod_python.
Que font les autres grandes Python équipes de faire? Quelle est la meilleure solution pour installer rapidement le même ensemble de paquets python?
Notes de bas de page:
- J'ai vu la question Comment rouler mes propres PyPI?, mais cette question a trait à l'hébergement d'un code privé.
- Le Python wiki les listes alternatives PyPI implémentations
- J'ai aussi récemment découvert Caisse.io mais je ne crois pas que ça m'aide lors de l'utilisation de Pip.
- Il y a une surveillance de site web PyPI état miroir
- Certains paquets sur PyPI leurs fichiers hébergé ailleurs de sorte que même un miroir parfait ne va pas aider toutes les dépendances
- Personnellement, quand j'étais dans une situation où j'avais besoin de faire un script (répété) création d'un virtualenv, je viens de construire .oeuf fichiers pour les paquets que je voulais et vérifié dans le repo avec le script de création de la virtualenv. Je ne prétends pas être une partie de grand python équipe, cependant.
Vous devez vous connecter pour publier un commentaire.
Avez-vous un système de fichiers partagé?
Parce que je voudrais utiliser du pip paramètre de cache. C'est assez simple. Faire un dossier appelé pip-cache dans /mnt par exemple.
Ensuite, chaque développeur devra mettre la ligne suivante dans leur pip config (unix = $HOME/.pip/pip.conf, win = %HOME%\pip\pip.ini)
Il vérifie toujours PyPi, recherche la dernière version. Vérifie ensuite si cette version dans le cache. Si si il l'installe à partir de là. Si non, il le télécharge. Il les stocke dans le cache et l'installe. De sorte que chaque colis ne serait téléchargés qu'une seule fois par la nouvelle version.
ConfigParser.ParsingError: File contains parsing errors
. J'aimerais le modifier moi-même, mais ne me permet pas de faire de petites modifications.Même si cela ne résout pas votre PyPI problème, la remise construit virtualenvs pour les développeurs (ou mutations) peut être fait avec Terrarium.
Utilisation terrarium pour emballer, compresser et enregistrer virtualenvs. Vous pouvez les stocker localement ou même les stocker sur S3. À partir de la documentation sur GitHub:
Après la construction d'un nouvel environnement, terrarium archiver et compresser l'environnement, puis de le copier à l'emplacement spécifié par le stockage-dir.
Sur les installe pour la même exigence que de spécifier le même stockage-dir, terrarium copier et extraire l'archive compressée à partir de /mnt/stockage.
À l'écran exactement comment terrarium nom de l'archive, vous pouvez exécuter la commande suivante:
J'ai récemment installé devpi dans mon équipe de développement du Vagabond de configuration de façon à ce que sa cache des paquets vie sur l'ordinateur hôte du système de fichiers. Cela permet à chaque VM à avoir son propre devpi-démon du serveur qu'il utilise comme index-url pour virtualenv/pip. Lorsque les machines virtuelles sont détruits et remis en service, les paquets n'ont pas à être téléchargé et plus. Chaque développeur télécharge un temps pour construire leur cache local pour aussi longtemps qu'ils vivent sur l'hôte du système de fichiers.
Nous avons également un interne PyPi indice pour nos packs privés c'est simplement un répertoire servi par Apache. En fin de compte, je vais convertir un devpi serveur proxy ainsi donc, notre serveur de build permet également de maintenir un cache des paquets pour nos Python dépendances en plus de l'hébergement de nos bibliothèques privées. Cela va créer un tampon supplémentaire entre notre environnement de développement, les déploiements de production et le public PyPi.
Ce qui semble être le plus robuste solution que j'ai trouvé à ces exigences à ce jour.
Prendre un coup d'oeil à David Wolever de pip2pi. Vous pouvez simplement mettre en place une tâche cron pour garder de l'entreprise ou de l'équipe-large miroir des paquets dont vous avez besoin, et puis pointez votre pips vers votre miroir interne.
Configuration de votre serveur local, puis modifier l'ordinateur local du fichier hosts afin de remplacer l'URL au lieu de pointer vers le serveur local ainsi sauter le standard DNS. Puis supprimer la ligne dans le fichier hôte si vous êtes fait.
Ou je suppose que vous pourriez trouver l'URL de la pip et le modifier.