41

新しい開発者がチームに参加するとき、または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をミラーリングする方法を検討しています。

私が見たオプションは次のとおりです。

  1. 自分のPyPIインスタンスを実行しています。公式のPyPI実装があります: CheeseShopと、 djangopypipypiserverなどのいくつかのサードパーティ実装(脚注を参照)

    このアプローチの問題は、ファイルのアップロードを伴う完全なPyPI機能には興味がなく、提供されるコンテンツをミラーリングしたいだけであるということです。

  2. pep381clientまたはpypi-mirrorを使用してPyPIミラーを実行します。

    これは機能するように見えますが、最初にPyPIからすべてをダウンロードするためにミラーが必要です。pep381clientのテストインスタンスを設定しましたが、ダウンロード速度は5 Kb/sから200Kb/ s(バイトではなくビット)の間で異なります。完全なPyPIアーカイブのコピーがどこかにない限り、便利なミラーを入手するには数週間かかります。

  3. yopypiなどのPyPIラウンドロビンプロキシを使用します。

    http://pypi.python.org自体が地理的に異なる複数のサーバーで構成されているため、これは重要ではありません。

  4. 開発者間でvirtualenvをコピーするか、現在のプロジェクトの依存関係のフォルダーをホストします。

    これは拡張性がありません。依存関係が時間の経過とともに(ゆっくりと)変化するいくつかの異なるPythonプロジェクトがあります。プロジェクトの依存関係が変更されたらすぐに、この中央フォルダーを更新して新しい依存関係を追加する必要があります。ただし、virtualenvのコピーは、パッケージのコピーよりも劣ります。これは、Cモジュールを含むPythonパッケージをターゲットシステム用にコンパイルする必要があるためです。私たちのチームには、LinuxとOSXの両方のユーザーがいます。

    (これはまだ悪い束の最良の選択肢のように見えます。)

  5. インテリジェントなPyPIキャッシングプロキシの使用:collective.eggproxy

    これは非常に優れたソリューションのようですが、PyPIの最後のバージョンは2009年のものであり、mod_pythonについて説明しています。

他の大規模なPythonチームは何をしていますか?同じPythonパッケージのセットをすばやくインストールするための最良の解決策は何ですか?

脚注:

4

5 に答える 5

33

共有ファイルシステムはありますか?

pipのキャッシュ設定を使用するためです。とても簡単です。たとえば、/mntにpip-cacheというフォルダを作成します。

mkdir /mnt/pip-cache

次に、各開発者は次の行をpip構成に追加します(unix = $ HOME / .pip / pip.conf、win =%HOME%\ pip \ pip.ini)

[global]
download-cache = /mnt/pip-cache

それでもPyPiをチェックし、最新バージョンを探します。次に、そのバージョンがキャッシュにあるかどうかを確認します。もしそうなら、そこからインストールします。そうでない場合はダウンロードします。キャッシュに保存してインストールします。したがって、各パッケージは新しいバージョンごとに1回だけダウンロードされます。

于 2013-03-21T22:44:12.110 に答える
9

PyPIの問題は解決されませんが、ビルドされたvirtualenvを開発者(またはデプロイメント)に渡すことは、Terrariumを使用して行うことができます。

テラリウムを使用して、virtualenvをパッケージ化し、圧縮し、保存します。それらをローカルに保存することも、S3に保存することもできます。GitHubのドキュメントから:

$ pip install terrarium
$ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt

新しい環境を構築した後、テラリウムは環境をアーカイブして圧縮し、storage-dirで指定された場所にコピーします。

同じstorage-dirを指定する同じ要件セットの後続のインストールで、terrariumは圧縮されたアーカイブを/ mnt/storageからコピーして抽出します。

テラリウムがアーカイブにどのように名前を付けるかを正確に表示するには、次のコマンドを実行できます。

$ terrarium key requirements.txt more_requirements.txt
x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1
于 2013-04-04T16:35:02.540 に答える
8

最近、開発チームのVagrant構成にdevpiをインストールして、パッケージキャッシュがホストのファイルシステムに存在するようにしました。これにより、各VMは、virtualenv/pipのインデックスURLとして使用する独自のdevpi-serverデーモンを持つことができます。VMが破棄されて再プロビジョニングされる場合、パッケージを何度もダウンロードする必要はありません。各開発者は、ホストのファイルシステムに存在する限り、それらを1回ダウンロードして、ローカルキャッシュを構築します。

また、プライベートパッケージ用の内部PyPiインデックスもあります。これは、現在Apacheによって提供されている単なるディレクトリです。最終的には、これをdevpiプロキシサーバーにも変換して、ビルドサーバーがプライベートライブラリのホストに加えて、Python依存関係のパッケージキャッシュも維持するようにします。これにより、開発環境、本番環境のデプロイ、パブリックPyPiの間に追加のバッファーが作成されます。

これは、これまでにこれらの要件に対して私が見つけた最も堅牢なソリューションのようです。

于 2014-01-28T20:51:53.920 に答える
4

DavidWoleverのpip2piを見てください。cronジョブを設定して、必要なパッケージの会社全体またはチーム全体のミラーを保持し、ピップを内部ミラーに向けることができます。

于 2013-04-25T18:40:21.970 に答える
-2

ローカルサーバーをセットアップしてから、ローカルコンピューターのhostsファイルを変更して、実際のURLを上書きし、代わりにローカルサーバーを指すようにして、標準のDNSをスキップします。完了したら、ホストファイルの行を削除します。

または、pipでURLを見つけて、それを変更できると思います。

于 2013-03-21T22:29:58.847 に答える