如何让 APT/Aptitude 优先选择较新的虚拟软件包而不是真实软件包

如何让 APT/Aptitude 优先选择较新的虚拟软件包而不是真实软件包

我最近构建了一个提供多个虚拟包的包,更具体地说是 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包(过渡方案)。它们将属于更高版本并自动获得优先权。

相关内容