TL;DR¶
Python標準パッケージインストーラ pip のバージョン20.3で、大きな機能追加 が行われます。これにより、既存のプロジェクトでもエラーが発生する可能性があるので、できれば事前に試しておきましょう。
Pythonパッケージの依存関係¶
pipコマンドでパッケージをインストールすると、そのパッケージが利用している、別のパッケージも自動的にインストールされます。たとえば、 A というパッケージをインストールするとき、A が B というパッケージを利用している場合は、自動的に B もインストールされます。
パッケージの依存関係では、依存するパッケージのバージョンも指定できます。例えば、
- パッケージ
Aのバージョン 1.0 はパッケージBの バージョン 1.0 を利用する - パッケージ
Aのバージョン 2.0 はパッケージBの バージョン 2.0 を利用する
のように設定できます。
このように設定しておけば、パッケージ A のバージョン 1.0 をインストールすると、自動的にパッケージ B のバージョン 1.0 をインストールしてくれます。また、パッケージ A のバージョン 2.0 をインストールすると、自動的にパッケージ B のバージョン 2.0 をインストールしてくれます
さて、ここにパッケージ A と、パッケージ B のバージョン 1.0に依存しているもう一つのパッケージ C があります。
パッケージ A のバージョン 2.0 がインストールされている状態で、パッケージ C をインストールするとどうなるでしょう?
パッケージ A のバージョン 2.0 はパッケージ B のバージョン 2.0を必要としていますが、パッケージ C はパッケージ B のバージョン 1.0 を指定しています。
あちらを立てればこちらが立たない状態ですが、これまでのpipコマンドは、パッケージ C で指定したパッケージ B のバージョン 1.0 をインストールしてしまいます。このため、パッケージ C のインストール後は、パッケージ A は動かなくなってしまいます。
これまで、こういった事態を避けるため、依存関係の解決は pip にまかせずに、インストールするバージョンを手動で明示的に指定したり、pipenv や poetry などの依存関係を解決するツールを利用する必要がありました。
新しい依存リゾルバ¶
現在、この問題を解決するためにpipの 改善 が進められています。近々リリースされる予定のバージョン20.3では、前述のパッケージ C をインストールすると
- パッケージ
Aのバージョン 2.0 とパッケージBのバージョン 2.0 をアンインストール - 改めてパッケージ
Aのバージョン 1.0 とパッケージBのバージョン 1.0 をインストール
としてバージョンの不整合を解決します。
現在リリース済みの pip 20.2でも、 --use-feature=2020-resolver というオプションを指定すると、新しい依存関係の解決を試せます。20.3 がリリースされると、これまでより依存関係のチェックが厳格になり、本番環境などでエラーが発生する可能性もあります。できるだけ、現在進行中のプロジェクトでも事前に試しておきましょう。