依存関係の競合があるパッケージをインストールするためのオーバーライドの提供

問題点

現在、ユーザーがプロジェクトで依存関係の競合を抱えている場合、pipはエラーを発生させることなく競合するパッケージをインストールするため、問題があることに気づかない可能性があります。

新しいpipリゾルバーはより厳密になり、依存関係が競合するパッケージをインストールすることはできなくなります。

その結果、一部のユーザーは、pipが競合するパッケージのインストールを拒否すると、新しいバージョンのpipが「壊れている」と感じる可能性があります。

このため、pipチームは、ユーザーが競合するパッケージをインストールできるようにするオーバーライドを提供する必要があるかどうかを知りたいと考えました。

推奨事項にスキップ

調査

次の紹介文を付けてアンケートを実施しました

teaとcoffeeというパッケージがあるとする

tea 1.0.0はwater <1.12に依存しています。
coffee 1.0.0はwater>=1.12に依存しています

tea 1.0.0とcoffee 1.0.0をインストールすると、それぞれが異なるバージョンのwaterに依存しているため、競合が発生します。これは「依存関係の競合」と呼ばれます。

pipチームは最近、pipが依存関係の競合を解決する方法を変更しました。新しい実装は以前よりも厳密です。pipは依存関係の競合があるパッケージをインストールしなくなりました。代わりにエラーが表示されます。

このアンケートの目的は、この動作をオーバーライドする方法を提供することについてフィードバックを収集することです。

すべての質問は任意です。可能な限り多くの情報を提供してください。

次に、ユーザーに尋ねました

  • pipは、依存関係の競合がある場合にユーザーがパッケージをインストールできるようにするオーバーライドを提供する必要があるかどうか

  • 「はい」または「いいえ」と答えた理由

  • 「はい」と答えたユーザーには、以下を尋ねました

    • いつオーバーライドを使用するか

    • オーバーライドをどのくらいの頻度で使用するか

    • pipがオーバーライドを提供しなかった場合、回避策を見つけるのがどれほど簡単か

    • どの構文を好むか

結果

合計で、アンケートに415件の回答がありました。

回答者の圧倒的多数(>70%)が、依存関係の競合がある場合にパッケージをインストールできるようにする何らかのオーバーライドを求めていることを示しました。この機能を望んでいるにもかかわらず、ほとんどの回答者は、それが存在する場合、「頻繁ではない」使用すると述べています。これは、それが日常的な使用に不可欠ではない高度な機能であることを示しています。それにもかかわらず、回避策を見つけるのが難しいまたは非常に難しい(>60%)ため、pipはオーバーライド機能を提供する必要があることを示唆しています(以下の推奨事項を参照)。

回答者の半数以上が、競合する依存関係を持つ複数のパッケージを一度にインストールする場合、pip install tea coffee --ignore-conflictsがこのコマンドに最適な構文であると述べました。pip install —-ignore-conflictsコマンドを使用する場合、回答者の大多数(>48%)は、pipが競合する依存関係の最新バージョンをインストールすることを望むと述べました。

ほとんどの回答者は、最新バージョンをデフォルトでインストールする方が安全であると示唆しました。なぜなら、独自の機能では再現するのが難しいセキュリティ修正や機能が含まれている可能性があるからです。また、依存関係はほとんどの場合、下位互換性があると信頼しています。ただし、競合するパッケージの古いバージョンを使用する必要がある場合に備えて、このデフォルトの動作をオーバーライドする方法が必要不可欠であると述べました。

推奨事項

この調査に基づいて、pipチームに以下のことを推奨します

  • 依存関係の競合があるパッケージをユーザーがインストールできるようにする--ignore-conflictsオプションを実装します

  • --ignore-conflictsは、競合するパッケージの最新バージョンをインストールするようにします。たとえば、競合するパッケージwater<1.1.2water≥1.1.2の場合、pipはwater≥1.1.2をインストールすることを推奨する必要があります。

  • ユーザーが、競合するパッケージのバージョンを指定することで、このデフォルトの動作をオーバーライドできるようにします。たとえば、pip install tea coffee water==1.1.1 --ignore-conflictsのようにします

  • ユーザーに--ignore-conflictsフラグを使用したこと、およびこれがプログラムで予期しない動作を引き起こす可能性があることを警告します