注記
ドキュメントのこのセクションは現在作成中です。pipの開発者は、このドキュメントを完成させるためにあなたの協力を歓迎します。手伝っていただける場合は、トラッキングissueでお知らせください。
リポジトリの構造とディレクトリ構成¶
pip
のコードベース(GitHubリポジトリ)は、標準的なPythonパッケージとして構成されています。
ルートとツール¶
README
、ライセンス、pyproject.toml
などはトップレベルにあります。
AUTHORS.txt
LICENSE.txt
MANIFEST.in
NEWS.rst
pyproject.toml
README.rst
noxfile.py
--pip
は自動化ツールであるNoxを使用しており、このファイルで構成されています。noxfile.py
は、テストの実行方法を簡素化するために、開発中にpip
が使用するいくつかの環境を記述します(複雑な状況です)。例:nox -s lint
、nox -s test-3.10
。「3.10」を「3.7」などに変更することで、異なるバージョンのPythonでテストを実行できます。.gitattributes
.gitignore
.mailmap
docs/
[ドキュメント、Sphinxでビルド]html/
[オンラインで利用可能なHTMLドキュメントのソース]man/
には、ディストリビューションがman pip
を実行することで使用できるmanページがあります。pip_sphinxext.py
[拡張機能 -- 他のパッケージには適用されないpip固有のSphinxプラグイン]requirements.txt
news/
[pipはニュースフラグメントを格納します... pipがユーザー向けの変更を行うたびに、changelogに含められるように、正しい拡張子と名前を持つファイルがこのディレクトリに追加されます(通常はGitHub issueを参照する短いメモ)。.. したがって、すべてのリリースでメンテナーはこのディレクトリ内の古いファイルを削除することになりますか? はい - NEWSファイルを生成し、古いものを自動削除するためにtowncrier自動化を使用します。これについての詳細は、コントリビューターのドキュメントにあります!]template.rst
[changelogのテンプレート -- これはtowncrierが使用するファイルです... これはjinjaですか?わかりません。towncrierのドキュメントを確認してください]
src/
[ソース、下記参照]tools/
[requirementsファイル、CIファイル、ヘルパーなどの、その他の開発ワークフローツール。たとえば、リリースの自動化]tests/
-- 実行できるテストが含まれています。はじめにに手順があります。__init__.py
conftest.py
data/
[テスト実行用のテストデータ -- 疑似パッケージインデックスが中に入っています!無効なものや有効なものがたくさんある小さなパッケージ。テストフィクスチャ。機能テストで使用されます]functional/
[pipのCLIの機能テスト -- エンドツーエンド。サブプロセスでpipを呼び出し、実行結果を目的の結果と照らし合わせて確認します。これもテストスイートを遅くする原因です]lib/
[テスト用のヘルパー]unit/
[ユニットテスト -- 高速で小さく、優れています!]
.github
srcディレクトリ¶
ルートディレクトリの src/
ディレクトリには、pipのコアソースコードが含まれています。src/pip/
内では、_internal/
にはpipメンテナーによって書かれたpipコードがあり、_vendor/
はpipの依存関係(他のパッケージからのコード)です。
src/
内
pip/
__init__.py
__main__.py
_internal/
[pipメンテナーによって書かれたすべてのpipコードが存在する場所 -- アンダーバーはプライベートを意味します。pipはライブラリではありません -- コマンドラインツールです!非常に重要な区別です!pipで何かをインストールしたい人は、内部構造を使用するべきではありません -- CLIを使用するべきです。これについてはドキュメントに注記があります。]__init__.py
build_env.py
cache.py
[pip内でキャッシュを処理する方法に関するすべての情報があります -- キャッシュ処理。PyPIのcachecontrolを使用し、pipにベンダー化されています]cli/
[コマンドラインインターフェースの管理用のヘルパーと追加コードを含むサブパッケージ。stdlibのargparseを使用します]commands/
[文字通り - 各ファイルはpip CLIのコマンドの名前です。それぞれに、セットアップに必要なもの、何が起こるかを定義するクラスがあります]configuration.py
download.py
exceptions.py
index/
locations/
main.py
[レガシーのエントリポイント]models/
[インプロセスのリファクタリング!目標:pipが内部的にデータの表現をモデル化する方法を改善すること -- データ表現。全体的なクリーンアップ。データの表現はコードベース全体に広がっています... リンクは1つのファイルのクラスで定義され、別のファイルはそのファイルからリンクをインポートします。時々循環依存関係!?!このような将来の状況を防ぐために、Pradyunはこれらをmodelsディレクトリに移動し始めました。]operations/
-- 少し変わったディレクトリです...Freeze.py
は以前そこに入っていました。Freezeは操作です -- operations.freezeがありました。次に「prepare」が追加されました(pkgの準備操作)。次に、環境の状態をチェックするために「check」が追加されました。[コマンドと操作の違いは何ですか?コマンドはCLIにあります。操作は、コマンドが言う操作の一部のサブセットを実際に実行する内部コードの一部です。install
コマンドは、たとえばcheck
とprepare
の一部を使用します。長期的には、Pradyunの目標はprepare.py
がなくなるように(他のファイルにリファクタリングされます)、operations
がcheck
とfreeze
だけになるようにすることです... ... Pradyunはこのリファクタリングを計画しています。[これはutils
とどのように比較されますか?]install/
-- さまざまな種類のプロジェクトのインストールに関連するモジュール用wheel.py
は、wheelファイルのインストールを管理するファイルです。これは、wheelの展開(「展開と拡散」)を処理します。PyPIにはwheel
という名前のパッケージがあり、wheelをビルドします -- これと混同しないでください。
pep425tags.py
-- packaging.tags(pipの外部にあるがpipによってベンダー化されているPyPIのライブラリ)にリファクタリングされます。PEP 425 タグ:多くの人がこれを求めていることがわかりました!組み込みディストリビューションの互換性タグ -> 例:プラットフォーム、Pythonバージョンなど。pyproject.py
--pyproject.toml
は新しい標準です(PEP 518 および PEP 517)。このファイルはpyproject.tomlを読み取り、その情報を他の場所に渡します。残りの処理は別のファイルで行われます。517と518のすべての処理は別のファイルにあります。req/
[リファクタリングが必要なディレクトリ。たくさん…… ステップ3を覚えていますか?依存関係の解決など?これがそのステップです!各ファイルは... インストールとアンインストール、パッケージに関する情報の取得のフロー全体を表します... ここの一部のファイルは1000行以上あります!(以前はもっと長かった?!)リファクタリングは開発者のエクスペリエンスを大幅に向上させます。また、2020年には `pip依存関係リゾルバーの改善`_ を行っているので、この多くが変更されています。]utils/
[「運用上」のpipではないものすべて...雑多な関数とファイルがここに集められています。ある程度整理はされています。ここに`models.py`があり、リファクタリングが必要です。`Deprecation.py`は便利で、他にも役立つものがありますが、ここに属さないものもあります。このあたりのリファクタリングのためにGitHub issueをいくつか立てるべきでしょう。チェックボックスリスト付きのissueがいくつかあってもいいかもしれません。]vcs/
[Version Control System(バージョン管理システム)の略です。pipがすべてのバージョン管理関連の処理を行う場所です。「pip install」コマンドの引数の一つとしてバージョン管理システムのリンクを指定できます。これらのコマンドはベンダー化されているのでしょうか?いいえ、subprocessを使って実行されています。パフォーマンスのため、pygitlib2などのライブラリを使うのではなく、subprocessを使う方が(私たちはそう考えています)理にかなっています。また、純粋なPythonで書かれていなければなりません。Cライブラリを含めることはできません。コンパイル済みのCのコードを含めると、実行環境にCライブラリがない場合に問題になるからです。]
_vendor/
[他のパッケージからのコード -- pip自身の依存関係... pipが既にマシンにインストールされていることを前提とできないため、自身のソースツリー内に含んでいます!]