APT/Aptitude が実際のパッケージよりも新しい仮想パッケージを優先するようにする方法

APT/Aptitude が実際のパッケージよりも新しい仮想パッケージを優先するようにする方法

私は最近、複数の仮想パッケージ、具体的には libsnmp-base、libsnmp30 などを提供する snmp を提供するパッケージを構築しました。

 - 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パッケージに依存する最小限のパッケージを作成することです(移行パッケージ)。それらはより高いバージョンとなり、自動的に優先されます。

関連情報