再現可能なインストール

pipは、様々なレベルの再現可能な環境を実現するために使用できます。このページでは、「再現可能」の意味の厳密さを増していく定義について説明します。

パッケージバージョンの固定

要件ファイルに依存関係のパッケージバージョンを固定することで、新しくリリースされたバージョンでのバグや非互換性から保護されます。

SomePackage == 1.2.3
DependencyOfSomePackage == 4.5.6

注記

固定とは、==演算子を使用して、パッケージを特定のバージョンにすることを要求することを指します。

パッケージバージョンを固定した要件ファイルは、pip freezeを使用して生成できます。これにより、トップレベルのパッケージだけでなく、それらの推移的な依存関係もすべて固定されます。--no-depsを使用してインストールを実行すると、明示的にリストされていないものをインストールしないという点で、さらに確実性を高めることができます。

この戦略は実装が容易で、OSやアーキテクチャを問わず機能します。ただし、パッケージを取得する場所(PyPIなど)と証明機関の認証チェーンを信頼しています。また、バージョンアップなしでパッケージが変更されないことを前提としています(PyPIはこの点で保護されています)。

ハッシュチェック

バージョン番号の固定に加えて、ダウンロードされたパッケージを検証するためのハッシュを追加できます。

FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

これにより、PyPIまたはHTTPS証明機関チェーンの侵害から保護されます。また、バージョン番号を変更せずにパッケージが変更されることからも保護されます(これを許可するインデックスの場合)。このアプローチは、自動化されたサーバー展開に適しています。

ハッシュチェックモードは、承認済みのパッケージを含むプライベートインデックスサーバーを実行する代わりに、作業を省力化できる代替手段です。パッケージのアップロード、ACLの維持、監査証跡の保持(VCSでは要件ファイルに無料で提供されます)が不要になります。また、ベンダーライブラリの代わりに使用でき、アップグレードが容易になり、VCSのノイズが減少します。もちろん、プライベートインデックスまたはベンダーライブラリの可用性という利点は提供されません。

pip-toolsはpipをベースにしたパッケージであり、要件ファイルの管理と生成のための優れたワークフローを提供します。

ホイールハウスの使用(別名インストールバンドル)

pip wheelを使用して、プロジェクトの依存関係すべてをコンパイル済みで単一ディレクトリにパッケージ化し、単一のアーカイブに変換できます。このアーカイブにより、インデックスサーバーが利用できない場合でもインストールが可能になり、時間のかかる再コンパイルが回避されます。

最新のUnixシステムでのバンドルの作成

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ python -m pip wheel -r requirements.txt --wheel-dir=$tempdir
$ cwd=`pwd`
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)

最新のUnixシステムでのバンドルからのインストール

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
$ python -m pip install --force-reinstall --no-index --no-deps $tempdir/*

このようなホイールハウスにはコンパイル済みのパッケージが含まれており、通常はOSとアーキテクチャに依存するため、これらのアーカイブは必ずしもマシン間で移植可能ではありません。

ハッシュチェックモードもこの方法と併用できます(これも要件ファイルを使用するため)、将来のアーカイブが同じパッケージで構築されていることを確認できます。

警告

setup.pysetup_requiresキーワード引数に注意してください。これを使用する(まれな)パッケージでは、pipの保護をスキップして、setuptoolsが直接それらの依存関係をダウンロードします。このようなパッケージを使用する必要がある場合は、setup_requiresの制御を参照してください。