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