Когда новый разработчик присоединяется к команде, или Jenkins запускает полную сборку, мне нужно создать новый virtualenv. Я часто нахожу, что настройка virtualenv с помощью Pip и большое количество (более 10) требований занимает очень много времени, чтобы установить все из 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 или pypi-mirror.
Похоже, что это может сработать, но для моего зеркала нужно сначала загрузить все из PyPI. Я установил тестовый экземпляр pep381client, но скорость загрузки варьируется от 5 Кбит/с до 200 Кбит/с (бит, а не байтов). Если там где-то копия полного архива PyPI, мне понадобится несколько недель, чтобы иметь полезное зеркало.
-
Использование прокси-сервера round-robin PyPI, такого как yopypi.
Теперь это не имеет значения, когда http://pypi.python.org состоит из несколько географически разных серверов.
-
Копирование виртуального пространства между разработчиками или размещение папки текущих зависимостей проекта.
Это не масштабируется: у нас есть несколько различных проектов Python, зависимости которых изменяются (медленно) со временем. Как только изменения любого проекта будут изменены, эта центральная папка должна быть обновлена, чтобы добавить новые зависимости. Копирование виртуального файла хуже, чем копирование пакетов, хотя, поскольку любые пакеты Python с модулями C необходимо скомпилировать для целевой системы. Наша команда имеет пользователей Linux и OS X.
(Это по-прежнему выглядит как лучший вариант плохой группы.)
-
Использование интеллектуального кэширующего прокси-сервера PyPI: collective.eggproxy
Кажется, это было бы очень хорошим решением, но последняя версия PyPI датируется 2009 годом и обсуждает mod_python.
Что делают другие большие команды Python? Какое лучшее решение для быстрой установки одного и того же набора пакетов python?
Сноска:
- Я видел вопрос Как свернуть собственный PyPI?, но этот вопрос связан с хостингом частного кода.
- Python wiki перечисляет альтернативные реализации PyPI
- Недавно я обнаружил Crate.io, но я не верю, что это помогает мне при использовании Pip.
- Там веб-сайт отслеживает статус зеркала PyPI
- Некоторые пакеты на PyPI имеют свои файлы, размещенные в другом месте, поэтому даже идеальное зеркало не поможет всем зависимостям