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 がリリースされると、これまでより依存関係のチェックが厳格になり、本番環境などでエラーが発生する可能性もあります。できるだけ、現在進行中のプロジェクトでも事前に試しておきましょう。