Làm thế nào để xóa một cuộc tranh luận mà không loại bỏ sự phụ thuộc của nó


43

Tôi muốn cài đặt phiên bản boto mới nhất , mà tôi thực hiện thông quapython setup.py install

Tuy nhiên, khi tôi cố gắng loại bỏ phiên bản cũ, các gói sau cũng bị xóa:

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

Làm cách nào tôi có thể yêu cầu người quản lý gói loại bỏ boto và họ đánh dấu nó là cài đặt bên ngoài (hoặc một cái gì đó tương tự) để apt không cố gắng khắc phục sự phụ thuộc bị thiếu?

Cảm ơn bạn,
Maxim.


Bạn đã thử <code> sudo dpkg --remove python-boto </ code> chưa?
dkuntz2

Câu trả lời:


16

Bạn có thể tạo một gói .deb giả bằng equivstiện ích này, nó sẽ cung cấp sự phụ thuộc mà không cần cài đặt bất kỳ tệp nào. Sau đó, chỉ cần thay thế gói hiện đang cài đặt thành phiên bản giả bằng cách sử dụng dpkg -i fake.deb.


60

Sử dụng dpkg trực tiếp, không phải apt-get hoặc aptitude:

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

1
Đúng nhưng khi tôi sẽ cố gắng sử dụng apt để cài đặt một cái gì đó thì sẽ phát hiện ra rằng gói tôi đã gỡ bỏ với dpkg bị thiếu và sẽ cài đặt lại nó. Câu hỏi làm thế nào để tôi thực hiện apt không muốn cài đặt lại / bỏ qua trạng thái nhất quán của nó?
Maxim Veksler

15

Tôi biết đây là một bài viết cũ, nhưng vì gần đây tôi có một vấn đề tương tự, tôi muốn chia sẻ giải pháp của mình với hy vọng ai đó trong tương lai thấy nó hữu ích.

Nếu bạn đã cài đặt một gói thông qua aptitude, nó sẽ tự động gán cờ cho các phụ thuộc (tự động) và khi bạn cố gắng loại bỏ gói của mình một lần nữa, nó sẽ cố gắng loại bỏ tất cả các phụ thuộc mà cờ tự động vẫn được đặt.

Như bạn có thể thấy trong trường hợp của tôi, đó là zabbix mà tôi muốn xóa:

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/?]

Và nếu chúng ta tra cứu gói apache thì nó trông như thế này

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

cờ đầu tiên "i" cho chúng ta biết rằng apache đã được cài đặt
Cờ tiếp theo "A" là viết tắt của cài đặt tự động

Vì vậy, để khắc phục điều này và không bị cài đặt apache, mysql và php, chúng ta chỉ cần xóa cờ tự động với khả năng như thế này:

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.

Bây giờ nó trông như thế này khi gỡ bỏ gói 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/?] 

Vui lòng kiểm tra trang người đàn ông để biết năng khiếu để biết thêm chi tiết


Đây dường như là câu trả lời tốt nhất trong tất cả (tùy thuộc vào tình huống). Không nên quá khó để thực hiện một lệnh tìm tất cả những người phụ thuộc và đưa họ đến unmarkauto.
johny tại sao

13

Đó chính xác apt-mark holdlà những gì dành cho.

apt-mark hold package_name

Từ tài liệu:

giữ được sử dụng để đánh dấu một gói là giữ lại, điều này sẽ ngăn gói tự động được cài đặt, nâng cấp hoặc gỡ bỏ. Lệnh chỉ là một trình bao bọc xung quanh các lựa chọn dpkg - do đó và trạng thái là do đó

Để mở gói

apt-mark unhold package_name


1
Đối với tình hình của tôi, đây là cách tiếp cận được đề nghị.
Paulo Coghi - Tái lập Monica

1
Thật không may, điều này không giữ được sự phụ thuộc. Tức là nếu tôi cài đặt các gói A và B và chúng có chung phụ thuộc X, việc giữ A sẽ không giữ X và xóa B sẽ không thành công với "E: Error, pkgPro HiệuResolver :: Giải quyết các ngắt được tạo, điều này có thể do các gói bị giữ."
MSalters

Tôi chỉ gặp lỗi khi cố gắng thực hiện việc này: 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

Để hoàn thành câu trả lời của João Pinto, bạn có thể sử dụng tập lệnh nhỏ của tôi để sửa gói bị hỏng, tập lệnh này sẽ tạo gói giả với phương trình và cài đặt nó. Bạn có thể tìm thấy một bài viết trên blog của tôi bằng tiếng Pháp .

Hoặc trực tiếp trên mã chính .

Để dùng nó:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.