Como fazer com que o APT/Aptitude prefira um pacote virtual mais recente em vez de um pacote real

Como fazer com que o APT/Aptitude prefira um pacote virtual mais recente em vez de um pacote real

Recentemente construí um pacote que fornece vários pacotes virtuais, mais especificamente snmp que fornece libsnmp-base, libsnmp30 e assim por diante:

 - 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

Ele está instalado no meu sistema e fornecido no meu PPA online. Quando tento instalar outro pacote (php7.0-snmp) que depende de libsnmp30 e libsnmp-base, o APT me oferece a opção de desinstalar o snmp para instalar as dependências necessárias.

Parece que o APT sempre prefere pacotes reais aos virtuais, apesar dos fatos:

  • os virtuais têm uma versão mais recente
  • eles já estão instalados

O Aptitude oferece mais soluções, mas nenhuma envolve a preferida e mais lógica: mantenha o snmp porque ele já oferece as dependências necessárias mais recentes:

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 ***

Como posso instalar o php7.0-snmpsem ter que desinstalar o snmp?

Responder1

Pacotes virtuais não podem ajudá-lo aqui. Deo Manual de Políticas Debian:

Se um campo de relacionamento tiver um número de versão anexado, apenas pacotes reais serão considerados para verificar se o relacionamento foi satisfeito (ou se a proibição foi violada, por conflito ou quebra). Em outras palavras, se um número de versão for especificado, esta é uma solicitação para ignorar todos os Provides para aquele nome de pacote e considerar apenas pacotes reais. O gerenciador de pacotes assumirá que um pacote que fornece esse pacote virtual não é da versão "correta". Um campo Fornece não pode conter números de versão, e o número da versão do pacote concreto que fornece um pacote virtual específico não será considerado ao considerar uma dependência ou conflito com o nome do pacote virtual.

Uma saída é criar pacotes mínimos para cada um dos pacotes fornecidos, que dependem apenas do seu snmppacote real (pacotes transitórios). Eles serão de uma versão superior e serão preferidos automaticamente.

informação relacionada