我最近构建了一个提供多个虚拟包的包,更具体地说是 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 政策手册:
如果关系字段附加了版本号,则只会考虑真实包,以查看关系是否得到满足(或是否违反了禁止,是否存在冲突或破坏)。换句话说,如果指定了版本号,则这是请求忽略该包名称的所有提供,并仅考虑真实包。包管理器将假定提供该虚拟包的包不是“正确”的版本。提供字段可能不包含版本号,并且在考虑对虚拟包名称的依赖或冲突时,不会考虑提供特定虚拟包的具体包的版本号。
一种方法是为每个提供的包创建最小包,这只取决于你的实际snmp
包(过渡方案)。它们将属于更高版本并自动获得优先权。