Как удалить деб, не удаляя его зависимости


43

Я хотел бы установить самую последнюю версию boto , которую я делаю черезpython setup.py install

Тем не менее, когда я пытаюсь удалить старую версию, следующие пакеты также удаляются:

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

Как я могу сказать менеджеру пакетов удалить boto, и они помечают его как установленный снаружи (или что-то в этом роде), чтобы apt не пыталась исправить отсутствующую зависимость?

Спасибо,
Максим.


Вы пробовали <code> sudo dpkg --remove python-boto </ code>?
dkuntz2

Ответы:


16

Вы можете создать фиктивный пакет .deb с помощью equivsутилиты, которая обеспечит зависимость без установки каких-либо файлов. Затем просто замените установленный пакет на фиктивную версию, используя dpkg -i fake.deb.


60

Используйте dpkg напрямую, а не apt-get или aptitude:

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

1
Правильно, но когда я попытаюсь использовать apt для установки чего-либо, он обнаружит, что пакет, который я удалил с помощью dpkg, отсутствует, и переустановит его. Вопрос как сделать так, чтобы apt не хотел переустанавливать его / игнорировать его состояние согласованности?
Максим Векслер

15

Я знаю, что это старый пост, но, поскольку у меня недавно была похожая проблема, я хотел бы поделиться своим решением в надежде, что кто-то в будущем найдет его полезным.

Если вы установили пакет через aptitude, он автоматически присваивает флаги зависимостям (auto), и при повторной попытке удаления пакета он пытается удалить все свои зависимости, для которых все еще установлен флаг auto.

Как вы можете видеть в моем случае, это zabbix, который я хочу удалить:

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

И если мы посмотрим на пакет Apache, он выглядит так

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

первый флаг «i» говорит нам, что Apache установлен
. Следующий флаг «A» означает автоматически установленный.

Поэтому, чтобы исправить это и не удалять apache, mysql и php, мы можем просто удалить флаг auto с помощью aptitude, например:

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.

Теперь при удалении пакета 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/?] 

Пожалуйста, проверьте man-страницу для aptitude для более подробной информации


Это кажется лучшим ответом из всех (в зависимости от ситуации). Не должно быть слишком сложно создать команду, которая находит все зависимости и передает их unmarkauto.
Джонни, почему

13

Это именно то apt-mark hold, для чего.

apt-mark hold package_name

Из документации:

Удержание используется, чтобы пометить пакет как задержанный, что предотвратит автоматическую установку, обновление или удаление пакета. Команда является только оболочкой для dpkg --set-selections, и поэтому состояние

Чтобы открыть пакет:

apt-mark unhold package_name


1
Для моей ситуации это рекомендуемый подход.
Пауло Коги - Восстановить Монику

1
К сожалению, это не может содержать зависимости. Т.е., если я устанавливаю пакеты A и B и они имеют общую зависимость X, удерживание A не будет удерживать X, а удаление B завершится неудачно с "E: Error, pkgProblemResolver :: Resolve генерирует разрывы, это может быть вызвано удерживаемыми пакетами".
MSalters

Я просто получаю сообщение об ошибке при попытке сделать это: 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

Чтобы завершить ответ Жоау Пинту, вы можете использовать мой маленький скрипт для исправления поврежденного пакета, этот скрипт создаст фиктивный пакет с эквивалентами и установит его. Вы можете найти статью в моем блоге на французском языке .

Или непосредственно по основному коду .

Чтобы использовать это:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.