注記
ドキュメントのこのセクションは現在執筆中です。pip開発者は、このドキュメントを完成させるためにあなたの協力を歓迎します。協力に興味がある場合は、追跡issueでお知らせください。
広範な機能概要¶
pipはパッケージインストーラーです。
pipはインストール以上のことを行います。キャッシュ、設定、独自の癖を持つCLIも備えています。しかし、主に
pipが行うこと
- 必要に応じて(ソース配布パッケージの場合、パッケージがホイールの場合は必要ありません)、パッケージの構築を管理します(パッケージ構築をバックエンドにオフロードします)。
- デフォルトでは、pipは下位互換性の理由から、パッケージの構築をsetuptoolsに委任します。しかし、setuptoolsは
setup.py
ファイルを持ち、それを呼び出して……情報を取得しますか?
どこにインストールするかを決定します。パッケージが構築されると、結果として得られる成果物は、適切な場所にあるシステムにインストールされます。PEP 517は、ビルドバックエンドとインストーラー間のインターフェースを定義します。
フローの概要¶
順序として、pipは何をしますか?
ユーザー入力(ユーザーが要求するパッケージを示すユーザー提供の文字列)を取得します。
それが何を意味するのかを把握します。ユーザーが要求したものを正確に把握し、pipが操作できるものに変換します(ユーザー入力を要件に変換)。
おそらく、プロセス全体の核心は?ステップ2から要件のセットを取得したら、それらを具体的な「インストールするもの」に展開する必要があります。ユーザーが指定した要件に基づいてインストールする必要があるその他の要件と、それらをどこから取得するかを把握します。
- このステップは複雑であり、探索的でもあり、依存関係が関与します。
解決が必要です。インデックスにアクセスして、利用可能なバージョンを確認する必要があります。
- 依存関係情報を取得するために、パッケージ自体を構築する必要がある場合があります。
つまり、パッケージインデックスからパッケージを取得する必要があります。つまり、それが存在するかどうかを知る必要があります。単一のパッケージの場合、
インストールする実際の項目をインストールします。
なぜか?pipはPyPI以外の場所からインストールします!また、これまでPyPIのJSON APIを保証したことがないため、パッケージ自体をダウンロードすることなくPyPIからメタデータを取得した人は誰もいません。
インストールプロセスのフローに関して
1つのパッケージの場合:そのパッケージの抽象的な要件を取得し、それが何を意味するのかを調べようとします(この抽象的な要件はさまざまな形式を取ることができます)。抽象的な依存関係を定義します。
「このパッケージをここから取得し、このパッケージのそのバージョンである」というセットができたら、
それらのものをインストールするために環境を変更します(つまり、ファイルを正しい場所に配置します)。たとえば、すでに要件のバージョン6.0があり、7.2をインストールする場合、6.0をアンインストールして7.2をインストールします。
ダウンロードプロセス¶
インストールで何が起こるか?まあ、install
のサブセット。通常、pipはpip install
中に実行するプロセスは、download
です(pip downloadコマンドとしてユーザーも利用できます)。また、マニフェストを取得するためにパッケージをダウンロードして検査します。特定のパッケージ名について、利用可能なファイルとファイル名を知る必要があります。
pipは、Pythonパッケージリポジトリからダウンロードできます。パッケージは構造化された形式で保存されており、pipのようなインストーラーが見つけることができます。
PEP 503は、Pythonパッケージリポジトリと通信するために使用するAPIを定義します。
PyPI¶
他に引数なしでpip download somepackage
を実行するとどうなりますか?デフォルトでは、PyPIを参照します。これは、pipがsomepackage
についてパッケージインデックスが知っていることをさらに詳しく調べる場所です。
pip
は、利用可能なファイルとファイル名を知っています。
言い換えれば
すべての依存関係が解決されるまで、以下を実行します。
PEP 503で定義されたAPIに従って、http://{pypi_index}/simple/{package_name}からインデックスページを取得します。
ページからすべてのファイルリンクを解析します。
リンクのリストからダウンロードする単一のファイルを選択します。
ダウンロードしたパッケージからメタデータを抽出します。
メタデータに基づいて依存関係ツリーを更新します。
パッケージインデックスは、そのパッケージのファイルのリストをpipに提供します(既存のPyPI API経由)。ファイルにはバージョンとその他の情報が含まれており、pipがダウンロードする必要があるかどうかを判断するのに役立ちます。
pipは、リストからダウンロードする単一のファイルを選択します。
戻って別のファイルをダウンロードすることもあります。
pipがパッケージインデックスを参照すると、参照する場所には基本的にリンクがあります。リンクのテキストはファイルの名前です。
これは、PyPI Simple APIです(PyPIにはいくつかのAPIがあり、一部は非推奨になっています)。pipは、最初にPEP 503で文書化されたSimple APIを参照します。packaging.python.orgには、Simple Repository APIの詳細が記載されたPyPA仕様があります。
このパッケージ名の場合、これが利用可能なファイルのリストです。
そこで探します
ファイル名のリスト
その他の情報
それらを入手したら、1つのファイルを選択してダウンロードします。
(質問:pip install flask
を実行したい場合、ファイル名のリスト全体が……そうすべきではない?私はFlaskだけが欲しい……なぜリスト全体を取得するのですか?
回答:すべてのファイルではなく、Flaskのファイルだけです。PyPIのすべてのファイルを取得するためのAPIはありません。Flaskのすべてのファイルを取得するためのものです。)