我最近建立了一個提供多個虛擬的套件,更具體地說是 snmp,它提供了 libsnmp-base、libsnmp30 等:
- Version: 5.8~git20160427.8d07349f-14
- Depends: ...
- Provides:
snmp,libsnmp-base,libsnmp-dev,libsnmp30,python-snmp,snmpd,snmptrapd,tkmib
- Conflicts:
libsnmp-base,libsnmp-dev,libsnmp30,python-snmp,snmpd,snmptrapd,tkmib
- Replaces:
libsnmp-base,libsnmp-dev,libsnmp30,python-snmp,snmpd,snmptrapd,tkmib
它安裝在我的系統上並在我的線上 PPA 上提供。當我嘗試安裝另一個依賴 libsnmp30 和 libsnmp-base 的軟體包 (php7.0-snmp) 時,APT 為我提供了卸載 snmp 的選項,以便安裝所需的依賴項。
看起來 APT 總是更喜歡真實的包而不是虛擬的包,儘管事實是:
- 虛擬的有更新的版本
- 他們已經安裝了
Aptitude 提供了更多解決方案,但沒有一個涉及首選且最合乎邏輯的解決方案:保留 snmp,因為它已經提供了最新所需的依賴項:
sudo aptitude install php7.0-snmpThe following NEW packages will be installed:
libsnmp30{a} php7.0-snmp
0 packages upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 832 kB of archives. After unpacking 3,382 kB will be used.
The following packages have unmet dependencies:
snmp : Conflicts: libsnmp30 but 5.7.3+dfsg-1ubuntu4 is to be installed.
The following actions will resolve these dependencies:
Remove the following packages:
1) snmp
Install the following packages:
2) libsnmp-base [5.7.3+dfsg-1ubuntu4 (xenial)]
Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:
Keep the following packages at their current version:
1) libsnmp30 [Not Installed]
2) php7.0-snmp [Not Installed]
Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:
Install the following packages:
1) libsnmp-base [5.7.3+dfsg-1ubuntu4 (xenial)]
Downgrade the following packages:
2) snmp [5.8~git20160427.8d07349f-14 (now) -> 5.7.3+dfsg-1ubuntu4 (xenial)]
Accept this solution? [Y/n/q/?] n
*** No more solutions available ***
如何安裝php7.0-snmp無需卸載 snmp?
答案1
虛擬包在這裡無法幫助您。從Debian 政策手冊:
如果關係欄位附加了版本號,則僅考慮真實的套件來查看關係是否滿足(或是否違反禁止,導致衝突或破壞)。換句話說,如果指定了版本號,則這是忽略該套件名稱的所有 Provides 並僅考慮真實套件的請求。套件管理器將假定提供該虛擬套件的套件不是「正確」的版本。 Provides 欄位可以不包含版本號,並且在考慮與虛擬套件名稱的依賴或衝突時,將不考慮提供特定虛擬套件的具體套件的版本號。
一種解決方法是為每個提供的包創建最小的包,這僅取決於您的實際snmp
包(過渡包)。它們將具有更高版本並自動成為首選。