Bagaimana saya bisa mengabaikan beberapa dependensi?

86

Bagaimana cara membuat apt-get mengabaikan beberapa dependensi? Misalnya, saya ingin menginstal mailx sehingga saya dapat menggunakannya untuk mengirim email dari skrip cron / alat penghasil laporan. Namun, menginstal mailx juga menginstal exim4 dan sejumlah dependensi (saya sudah menginstal Postfix) Saya tidak benar-benar membutuhkan dan yang saya kira mailx juga dapat hidup tanpanya.

Bagaimana saya mengabaikan beberapa dependensi tetapi masih menggunakan apt-get karena ini adalah alat yang bagus?

FrancisV
sumber
bagaimana postfix diinstal? melalui paket debian? atau apakah Anda menginstal postfix dari sumber?
rebus
Ya, Postfix diinstal dari sumber
FrancisV
3
Paket mailx Debian hanya 'merekomendasikan' exim4, tidak memerlukannya. Jika Anda tidak ingin menginstal paket yang direkomendasikan, tambahkan saja APT::Install-Recommends "false";ke apt.conf.
ruief
Saya menemukan jawaban yang memuaskan untuk ini di unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Jawaban:

45

Solusi sederhana dan mudah: cukup tentukan paket yang tidak diinginkan dengan tambahan -setelah masing-masing.

Contoh tanpa -saklar:

root@debian:~# apt-get install bsd-mailx 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  exim4-base exim4-config exim4-daemon-light liblockfile-bin liblockfile1
[...]

Contoh menggunakan sakelar untuk menghindari pemasangan exim4-base . Perhatikan -bagian akhir:

root@debian:~# apt-get install bsd-mailx exim4-base-
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'exim4-base' is not installed, so not removed
The following extra packages will be installed:
  liblockfile-bin liblockfile1 ssmtp
[...]

Seperti yang Anda lihat, apt-getjangan mencoba lagi untuk menginstal exim4-basepaket, dan tidak mencoba untuk menginstal berbagai dependensinya ( exim4-configdll).

Dan jika Anda salah dan membutuhkan exim4-baseketergantungan itu, Anda bisa apt-get installmelakukannya nanti!

Jealie
sumber
5
Ini adalah cara terbaik untuk menghindari menginstal ketergantungan tertentu. Jawaban lain baik menghindari menginstal semua dependensi, menghapus instalan dependensi setelah mereka diinstal, atau menyarankan paket mengedit membosankan.
Neil
1
Ini persis apa yang saya butuhkan! (menginstal gnupg2tanpa pinentry-gtk2untuk menghindari deps X)
lapo
Namun, itu benar-benar hebat, dalam kasus saya apt-get menolak untuk menginstal paket dengan "dependensi yang tidak terpenuhi" (yang saya tentukan menggunakan metode ini). Khususnya paket dokumentasi 100 megabyte yang tidak saya pedulikan.
Rolf
3
Hanya berfungsi dengan dependensi opsional, bukan yang diperlukan. Kesalahan rmessage: Depends: xxx but it is not going to be installed. Anda dapat melewati semua paket opsional denganapt-get install --no-install-recommends PACKAGE
koppor
Juga tidak berfungsi dengan paket virtual. Tetapi lihat unix.stackexchange.com/a/404449/23542
artfulrobot
55

Anda dapat mengubah dependensi paket deb seperti ini:

  1. Buka paket deb: ar x golden-linux.deb(akan membuat tiga file: debian-binary control.tar.gz data.tar.gz)
  2. Buka arsip kontrol arsip: tar xzf control.tar.gz(akan membuat: postrm postrm preinst prerm md5sums control)
  3. Perbaiki ketergantungan dalam control(gunakan editor teks)
  4. Repack control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Repack deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(urutan penting! Lihat [Catatan])

[Catatan]: dpkg tidak akan bisa membaca metadata suatu paket dengan cepat jika harus mencari di mana bagian data berakhir!

Janus Troelsen
sumber
2
Bagus, itu menyelesaikan kasus khusus untuk "raring8" hingga "raring6" tetapi versi yang sama = (, terima kasih
Felipe Alcacibar
1
Terima kasih dari saya juga; Saya harus menggunakan ini karena aplikasi diperlukan libmng1.so.1meskipun itu berfungsi dengan baik dengan set symlink ke libmng1.so.2. apt-gettidak bisa diberangus dan terus mengganggu saya tentang dependensi yang tidak terpenuhi (bahkan ketika menginstal sesuatu yang sama sekali tidak berhubungan!) Apa konsep sampah yang penuh.
syntaxerror
+1 Ini berfungsi dengan baik untuk saya juga. Paket gnome-settings-daemoningin gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11tetapi saya sudah punya gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- perhatikan ".2" di akhir). Prosedur ini memungkinkan saya untuk mengedit paket dan memaksanya untuk menggunakan versi 11.2 yang lebih baru. TERIMA KASIH!
Eric Duncan
1
Solusi bagus, terima kasih. Saya memodifikasi langkah 2 dan 4 sedikit: 2. FILES=$(tar zxvf control.tar.gz)untuk menyimpan daftar file dalam suatu variabel. 4. tar zcf control.tar.gz $FILES- buat arsip dalam satu langkah tanpa pipa atau pengalihan menggunakan daftar file asli (setelah modifikasi).
Brett
2
Saran pasangan lain. Untuk # 4: tambahkan --ignore-failed-readsehingga tarmengabaikan file yang hilang dari sisa baris perintah. (Sebagai contoh, prerm, postrmabsen dari banyak paket.) Juga, tarball dapat .xzdaripada .gzdalam versi yang lebih baru dari Debian format arsip (misalnya data.tar.xz).
Dan Lenski
33

Setelah Anda menginstal paket dengan --ignore-depends opsi, pergi dan edit /var/lib/dpkg/statusfile, dan hapus dependensi apa pun yang Anda pikir tidak diperlukan. Berhati-hatilah. Untuk memesan dep. akan diperlukan, itu lebih dari mungkin untuk BE diperlukan

Manolis
sumber
3
Setelah memperbarui /var/lib/dpkg/statusmungkin diperlukan untuk menyelesaikan instalasi dengan sudo apt-get -f install(tidak perlu menentukan paket).
Zmicier Zaleznicenka
Juga ditemukan di sini: superuser.com/a/815371/127024 .
Johann
Ini membuat saya merinding, tetapi berhasil dengan sempurna!
David Schmitt
25

Anda dapat mencoba --nodepsbendera dengan apt-get.
Atau unduh paket dan instal menggunakan dpkgdengan opsi --ignore-depends.

Misalnya, jika Anda ingin menginstal paket footanpa ketergantungan bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Bart De Vos
sumber
52
Versi APT mana yang Anda miliki? Milik saya ( 0.8.10 ) tidak memiliki opsi seperti itu.
tshepang
8
mengatakan dpkg untuk mengabaikan ketergantungan bukan pilihan baginya. Itu hanya memberitahu dpkg untuk mengabaikan dependensi untuk transaksi INI, ia akan mencoba untuk kemudian memenuhi dependensi atau menghapus pacakge saat Anda melakukan sesuatu berikutnya.
rebus
2
Masih tidak beruntung dengan APT 0.8.16 BTW. Sayang sekali karena sepertinya tidak ada alternatif yang masuk akal. Versi mana yang Anda gunakan pada 2011 untuk membuatnya berfungsi?
Christian
2
Anda dapat menggunakan unduhan apt-get dan kemudian dpkg
Frederick Roth
7
--no-install-recommendsbekerja untukku.
Olle Härstedt
14

Karena Anda menginstal postfix dari sumber, Anda perlu menginstal paket "dummy" yang akan memuaskan ketergantungan mail-transport-agent dari mailx (atau bsd-mailx). Paket "equivs" dalam debian ada untuk membuat paket dummy yang dapat Anda instal untuk memberi tahu dpkg "ketergantungan ini terpenuhi"

Alasan mengatakan dpkg untuk mengabaikan dependensi bukanlah solusi yang baik, adalah bahwa Anda hanya memberitahu dpkg / apt untuk mengabaikannya untuk satu transaksi, Anda tidak bisa mengatakannya untuk mengabaikan dependensi selamanya. Setiap kali Anda menggunakan apt, ia memeriksa dependensi pada semua paket

rebus
sumber
2
Lihat juga jawaban ini yang menautkan ke tutorial (meskipun terlalu rumit) superuser.com/a/416560/128960 . Versi singkatnya adalah: jalankan equivs-control <name>, edit file yang dihasilkan untuk memberikan ketergantungan yang tepat dan memiliki nama yang bagus, kemudian jalankan equivs-build <name>dan akhirnya dpkg -idihasilkan file .deb.
Christian
1
IMHO ini benar-benar solusi terbaik. Semua solusi lain yang diminta di sini agak terlalu meretas. Yang ini hanya perlu dilakukan satu kali dan Anda dapat menginstal perangkat lunak apa pun tergantung pada perangkat lunak yang dikompilasi sendiri setelah itu ... Jadi, mari kita pilih jawaban ini!
rugk
7

Saya telah mencari opsi ini pada Ubuntu 12.04 Server yang menjalankan Xen. Di domain saya, saya menggunakan kernel -virtual, dan terus mencoba menginstal grub dengan setiap peningkatan paket kernel. Namun Grub tidak diperlukan di dalam domU saat menggunakan p [yv] grub.

Saya telah mencari opsi -nodeps untuk apt-get juga, tetapi tidak berhasil, jadi akhirnya mencopot / membersihkan grub * setelah setiap peningkatan kernel.

Lagi pula, benar-benar membaca halaman manual kadang-kadang membantu - ternyata opsi apt-get yang sama pada 12,04 tampaknya --tidak-instal-merekomendasikan, yang benar-benar berfungsi dalam kasus ini, karena grub terdaftar sebagai 'direkomendasikan' di informasi paket (saya kira itu bukan ketergantungan "nyata"?).

Saya menambahkan ini di sini karena dalam kasus saya ini memecahkan masalah yang sama, dan petunjuk untuk '--tidak menginstal-merekomendasikan' belum disebutkan.

memartin
sumber
6

Anda dapat mengunduh paket dengan apt-get dan kemudian menginstalnya dengan dpkg, mendaftar secara manual ketergantungan yang ingin Anda abaikan.

Sebagai contoh jika saya ingin mengunduh mypackage tetapi itu tergantung pada libperl5.14 dan saya tidak ingin menginstal libperl5.14 karena saya memiliki versi yang berbeda, saya dapat mengabaikan ketergantungan ini sebagai berikut:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
A.Badger
sumber
Hanya untuk menyebutkan bahwa ini akan membuat Anda cenderung "rusak". Itu tidak akan membiarkan Anda menginstal paket lain sampai Anda memperbaiki ketergantungan yang hilang.
drpexe
6

Cara alternatif untuk mengubah ketergantungan secara manual adalah:

apt-get download yourpackage
dpkg-deb -x yourpackage.deb PackageFolder
dpkg-deb --control yourpackage.deb PackageFolder/DEBIAN
vim PackageFolder/DEBIAN/control
dpkg -b PackageFolder yourpackage2.deb
apt-get install ./yourpackage2.deb
AndrewHarvey
sumber
2

Pada sistem debian saya, bsd-mailx sebenarnya tergantung pada default-mta | mail-transport-agent(Anda dapat memeriksa apa paket tergantung dengan apt-cache show <pkg>apa pun di arsip atau dpkg -s <pkg>untuk paket yang diinstal.

Mungkin paket postfix Anda tidak memilikinya Provides: mail-transport-agentsehingga tidak menyadari bahwa Anda telah menginstal MTA. Akan sangat berharga untuk melaporkan bug jika itu adalah paket resmi.

Andy
sumber
1

Untuk keperluan ini, Anda bisa menginstal kuku yang saya pikir tidak memiliki dependensi ini?

apt-get install nail
jamespo
sumber
-5

Yah - jangan.

Menggunakan pekerjaan orang lain sangat penting dalam perjalanan menuju kesuksesan. Ketika Anda membangun beberapa perangkat lunak dari sumber (tarball), Anda kehilangan kesempatan untuk menggunakan pekerjaan manajer paket distro itu.

Anda tidak akan mendapatkan pembaruan "gratis". Sebagian besar waktu tidak pernah memperbarui paket yang mereka instal dari sumber. Karena mereka perlu melacak perangkat lunak untuk versi baru, membangunnya kembali dan semua program yang tergantung (cobalah untuk mengingatnya).

Anda akan mengalami masalah dengan paket lain dari repo distribusi Anda. Ini persis seperti yang dinyatakan dalam pertanyaan: ubuntu memiliki manajer paket yang hebat dan beberapa orang yang sangat baik menjaga paket. Dan mereka telah memutuskan, bahwa agar program mailx berfungsi, Anda memerlukan MTA. Jadi jika Anda menginstal postfix dari sumber ubuntu tidak akan meminta Anda untuk menginstal exim.

Jika karena alasan tertentu pemeliharaan server beralih ke orang lain (mis. Proyek Anda menjadi sangat sukses dan Anda memutuskan untuk mempekerjakan orang lain untuk mengelola server sementara Anda sibuk dengan hal-hal lain) ia secara alami akan berharap untuk berlari dpkg --get-selectionsuntuk mendapatkan semua paket yang diinstal.

Cobalah untuk menggunakan perangkat lunak manajemen paket distro sebanyak mungkin. Belajarlah untuk membangun paket Anda sendiri jika Anda tidak dapat menemukan satu prebuilt dan Anda akan menjadi profesional yang lebih baik.

skarap
sumber