Cara menghapus deb tanpa menghapus ketergantungannya


43

Saya ingin menginstal versi boto terbaru , yang saya lakukan viapython setup.py install

Namun ketika saya mencoba untuk menghapus versi lama paket-paket berikut juga bisa dihapus:

apt-get remove python-boto
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  cloud-init cloud-utils euca2ools python-boto

Bagaimana saya bisa memberitahu manajer paket untuk menghapus boto, dan mereka menandainya sebagai diinstal secara eksternal (atau sesuatu seperti itu) sehingga apt tidak akan mencoba untuk memperbaiki ketergantungan yang hilang?

Terima kasih,
Maxim.


Sudahkah Anda mencoba <code> sudo dpkg --remove python-boto </code>?
dkuntz2

Jawaban:


16

Anda dapat membuat paket .deb dummy menggunakan equivsutilitas, ini akan memberikan ketergantungan tanpa menginstal file apa pun. Kemudian cukup ganti paket yang saat ini diinstal ke versi dummy menggunakan dpkg -i fake.deb.


60

Gunakan dpkg secara langsung, bukan apt-get atau aptitude:

sudo dpkg -r --force-depends "packagename-version"

1
Benar tetapi ketika saya akan mencoba menggunakan apt untuk menginstal sesuatu, itu akan mendeteksi bahwa paket saya dihapus dengan dpkg hilang dan akan menginstalnya kembali. Pertanyaannya, bagaimana cara membuat saya tidak ingin menginstal ulang / mengabaikan status konsistensi itu?
Maxim Veksler

15

Saya tahu ini adalah posting lama, tetapi karena saya baru-baru ini memiliki masalah yang sama, saya ingin membagikan solusi saya dengan harapan bahwa seseorang di masa depan akan merasakan manfaatnya.

Jika Anda menginstal sebuah paket melalui aptitude, ia secara otomatis memberikan flag ke dependensi (otomatis) dan ketika Anda mencoba untuk menghapus paket Anda lagi, ia mencoba untuk menghapus semua dependensinya yang memiliki flag otomatis masih diatur.

Seperti yang Anda lihat dalam kasus saya, ini adalah zabbix yang ingin saya hapus:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  apache2{u} dbconfig-common{u} fping{u} javascript-common{u} libhtml-template-perl{u} libiksemel3{u} libjs-prototype{u} 
  libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} mysql-server{u} mysql-server-5.1{u} mysql-server-core-5.1{u} php5{u} php5-gd{u} 
  php5-mysql{u} snmpd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 20 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 44.9 MB will be freed.
Do you want to continue? [Y/n/?]

Dan jika kita mencari paket apache sepertinya ini

uman@mango:~$ aptitude search ^apache2
i A apache2        - Apache HTTP Server metapackage
<snip>

bendera pertama "i" memberitahu kita bahwa apache diinstal
. Bendera berikutnya "A" adalah singkatan dari diinstal secara otomatis

Jadi untuk memperbaiki ini dan tidak memiliki apache, mysql dan php dihapus, kita bisa menghapus flag otomatis dengan aptitude seperti ini:

uman@mango:~$ sudo aptitude unmarkauto apache2 mysql-server php5
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

Sekarang kelihatannya seperti ini saat menghapus paket zabbix:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  dbconfig-common{u} fping{u} javascript-common{u} libiksemel3{u} libjs-prototype{u} libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} 
  php5-gd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 12 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 16.6 MB will be freed.
Do you want to continue? [Y/n/?] 

Silakan periksa halaman manual untuk aptitude untuk lebih jelasnya


Ini sepertinya jawaban terbaik dari semuanya (tergantung situasi). Seharusnya tidak terlalu sulit untuk membuat perintah yang menemukan semua tanggungan dan mengirim mereka ke unmarkauto.
Johnny mengapa

13

Itulah tepatnya untuk apa apt-mark hold.

apt-mark hold package_name

Dari dokumentasi:

tahan digunakan untuk menandai suatu paket sebagai menahan, yang akan mencegah paket dari secara otomatis diinstal, ditingkatkan atau dihapus. Perintah ini hanya pembungkus dpkg --set-selection dan karena itu statusnya

Untuk melepaskan paket:

apt-mark unhold package_name


1
Untuk situasi saya, ini adalah pendekatan yang direkomendasikan.
Paulo Coghi - Reinstate Monica

1
Sayangnya, ini gagal menahan ketergantungan. Yaitu jika saya menginstal paket A dan B dan mereka berbagi ketergantungan umum X, memegang A tidak akan menahan X, dan menghapus B akan gagal dengan "E: Error, pkgProblemResolver :: Menyelesaikan kerusakan yang dihasilkan, ini mungkin disebabkan oleh paket yang ditahan."
MSalters

Saya baru saja mendapatkan kesalahan ketika mencoba melakukan ini: The following packages have unmet dependencies: mysql-server-5.7 : Depends: apparmor (>= 2.10) but it is not going to be installed E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
frogstarr78


0

Untuk menyelesaikan jawaban João Pinto, Anda dapat menggunakan skrip kecil saya untuk memperbaiki paket yang rusak, skrip ini akan membuat paket dummy dengan equivs dan menginstalnya. Anda dapat menemukan artikel di blog saya dalam bahasa Prancis .

Atau langsung pada kode inti .

Untuk menggunakannya:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.