当一个新的开发人员加入团队,或者Jenkins运行一个完整的构建时,我需要创建一个新的virtualenv。我经常发现,使用Pip和大量(超过10个)需求设置virtualenv需要很长时间才能安装PyPI中的所有内容。
通常它会完全失败: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
我知道Pip的--use-mirrors标志,有时我的团队中的人通过使用--index-url http://f.pypi.python.org/simple(或另一个镜像)来工作,直到他们有一个及时响应的镜像。我们在英国,但德国有一个PyPI镜像,我们从其他网站下载数据没有问题。
所以,我正在为我们的团队寻找在内部镜像PyPI的方法。
我看到的选项是:运行我自己的PyPI实例。有正式的PyPI实现:CheeseShop以及几个第三方实现,如:djangopypi和pypiserver(见脚注)
这种方法的问题是,我对文件上传的完整PyPI功能不感兴趣,我只想镜像它提供的内容。
这看起来可以工作,但它需要我的镜像先从PyPI下载所有内容。我已经设置了一个pep381client的测试实例,但是我的下载速度在5kb/s到200kb/s(位,而不是字节)之间变化。除非某个地方有完整的PyPI档案的副本,否则我需要几个星期才能有一个有用的镜像。
这是不可扩展的:我们有几个不同的Python项目,它们的依赖关系随着时间的推移(缓慢)变化。任何项目的依赖项一旦更改,必须更新此中心文件夹以添加新的依赖项。不过,复制virtualenv比复制包更糟糕,因为任何带有C模块的Python包都需要为目标系统编译。我们的团队同时拥有Linux和OSX用户。
(这看起来仍然是坏货中的最佳选择。)
其他大型Python团队做什么?快速安装同一组python包的最佳解决方案是什么?
脚注: