提供覆寫以安裝具有衝突依賴項的套件

問題

目前,當使用者在他們的專案中有相依性衝突時,他們可能不會意識到問題所在,因為 pip 會安裝衝突套件而不會產生錯誤。

新的 pip 解決器較為嚴格,將不再允許使用者安裝具有衝突相依項的套件。

因此,當 pip 拒絕安裝衝突套件時,一些使用者可能會認為 pip 的較新版本「損壞」。

由於這個原因,pip 團隊想知道他們是否應該提供允許使用者安裝衝突套件的覆寫。

跳到建議

研究

以下是我們的問卷調查簡介

假設你擁有套件茶和咖啡

茶 1.0.0 相依於 water <1.12。
咖啡 1.0.0 相依於 water>=1.12

安裝茶 1.0.0 和咖啡 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 旗標,這可能會導致其程式產生意外的行為