Misalnya, awk
adalah paket virtual yang disediakan oleh original-awk
, mawk
dan gawk
.
Mencoba menginstalnya secara langsung menghasilkan:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package awk is a virtual package provided by:
original-awk:i386 2012-12-20-4
mawk:i386 1.3.3-17ubuntu2
gawk:i386 1:4.1.1+dfsg-1
original-awk 2012-12-20-4
mawk 1.3.3-17ubuntu2
gawk 1:4.1.1+dfsg-1
You should explicitly select one to install.
E: Package 'awk' has no installation candidate
Namun banyak paket virtual diperlukan sebagai dependensi oleh paket yang diinstal secara default, misalnya awk
sendiri dibutuhkan oleh base-files
, yang memeriksa log APT diinstal bersama dengan sekelompok paket lain melalui apt-get --yes
; entah bagaimana APT akhirnya memilih salah satu dari tiga secara otomatis (saya cukup yakin itu mawk
, tapi bukan itu inti pertanyaannya).
Bagaimana cara APT memilih paket khusus untuk diinstal dalam kasus ini?
Jawaban yang Diterima:
Bagaimana cara APT memilih paket khusus untuk diinstal dalam kasus ini?
APT tidak memilih paket. Ini memberitahu:
Anda harus memilih satu secara eksplisit untuk menginstal.
Jika Anda mencoba memilih paket secara manual, paket tersebut tidak akan diinstal.
Dalam kasus file dasar tergantung pada awk itu tidak relevan. Pertama, itu sebenarnya Bergantung pada awk, memaksa dpkg untuk menginstal awk sebelum mulai menginstal file dasar; kedua, mawk memiliki prioritas yang diperlukan yang diinstal pada instalasi sistem, dan akan mengganggu Anda jika Anda mencoba untuk menghapusnya. Jadi, jangan lakukan itu.
Sekarang, menurut sumber, apt mencoba memuaskan ketergantungan terlebih dahulu sebelum mencoba dengan paket virtual (yaitu, jika depend adalah firefox | www-browser
, memeriksa apakah ada paket yang diinstal, lalu coba instal firefox jika tidak ada). Jika paket non-virtual tidak tersedia, tampaknya hanya mengulangi semua paket yang menyediakan paket virtual, jika tidak ada dependensi lain yang rusak. Bukti komentar lain dari perilaku ini adalah ini yang mengarah ke fungsi GrpIterator::FindPreferredPkg.