新しい開発者がチームに参加するとき、または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
私はピップの--use-mirrors
旗を知っています、そして時々私のチームの人々は--index-url http://f.pypi.python.org/simple
彼らがタイムリーに反応するミラーを手に入れるまで(または別のミラー)を使って回避しました。私たちは英国にいますが、ドイツにはPyPIミラーがあり、他のサイトからのデータのダウンロードに問題はありません。
そのため、私はチームの内部でPyPIをミラーリングする方法を検討しています。
私が見たオプションは次のとおりです。
自分のPyPIインスタンスを実行しています。公式のPyPI実装があります: CheeseShopと、 djangopypiやpypiserverなどのいくつかのサードパーティ実装(脚注を参照)
このアプローチの問題は、ファイルのアップロードを伴う完全なPyPI機能には興味がなく、提供されるコンテンツをミラーリングしたいだけであるということです。
pep381clientまたはpypi-mirrorを使用してPyPIミラーを実行します。
これは機能するように見えますが、最初にPyPIからすべてをダウンロードするためにミラーが必要です。pep381clientのテストインスタンスを設定しましたが、ダウンロード速度は5 Kb/sから200Kb/ s(バイトではなくビット)の間で異なります。完全なPyPIアーカイブのコピーがどこかにない限り、便利なミラーを入手するには数週間かかります。
yopypiなどのPyPIラウンドロビンプロキシを使用します。
http://pypi.python.org自体が地理的に異なる複数のサーバーで構成されているため、これは重要ではありません。
開発者間でvirtualenvをコピーするか、現在のプロジェクトの依存関係のフォルダーをホストします。
これは拡張性がありません。依存関係が時間の経過とともに(ゆっくりと)変化するいくつかの異なるPythonプロジェクトがあります。プロジェクトの依存関係が変更されたらすぐに、この中央フォルダーを更新して新しい依存関係を追加する必要があります。ただし、virtualenvのコピーは、パッケージのコピーよりも劣ります。これは、Cモジュールを含むPythonパッケージをターゲットシステム用にコンパイルする必要があるためです。私たちのチームには、LinuxとOSXの両方のユーザーがいます。
(これはまだ悪い束の最良の選択肢のように見えます。)
インテリジェントなPyPIキャッシングプロキシの使用:collective.eggproxy
これは非常に優れたソリューションのようですが、PyPIの最後のバージョンは2009年のものであり、mod_pythonについて説明しています。
他の大規模なPythonチームは何をしていますか?同じPythonパッケージのセットをすばやくインストールするための最良の解決策は何ですか?
脚注:
- 自分のPyPIをロールする方法についての質問を見ました。、しかし、その質問はプライベートコードのホスティングに関連しています。
- Python wikiには、代替のPyPI実装がリストされています
- 最近Crate.ioも発見しましたが、Pipを使用するときにそれが役立つとは思いません。
- PyPIミラーステータスを監視するWebサイトがあります
- PyPIの一部のパッケージでは、ファイルが他の場所でホストされているため、完全なミラーでさえすべての依存関係を支援することはできません。