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

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"
rogerdpack
источник
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
heralight
источник