Як зняти борг, не знімаючи його залежностей


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 чи здатність:

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

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

15

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

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

Як ви бачите в моєму випадку, я забою видалити:

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

І якщо ми подивимось на пакет апаш, це виглядає приблизно так

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

перший прапор "i" повідомляє нам, що встановлений apache
. Наступний прапор "A" означає автоматичне встановлення

Таким чином, щоб виправити це і не мати видалення apache, mysql та php, ми можемо просто видалити автоматичний прапор з такою придатністю:

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

Будь ласка, ознайомтеся з підручною сторінкою щодо можливості для отримання детальної інформації


Це здається найкращою відповіддю з усіх (залежно від ситуації). Не повинно бути занадто важким, щоб скласти команду, яка знаходить усіх утриманців і передає їх unmarkauto.
johny чому

13

Саме це і apt-mark holdє для чого.

apt-mark hold package_name

З документації:

утримування використовується для позначення пакету як затриманого, що запобігає автоматичному встановленню, модернізації або видаленню пакета. Команда є лише обгорткою навколо dpkg --set-selects і тому стан є

Щоб зняти пакет:

apt-mark unhold package_name


1
Для моєї ситуації це рекомендований підхід.
Paulo Coghi - Відновіть Моніку

1
На жаль, це не вдається утримувати залежності. Тобто, якщо я встановлю пакети A і B і вони поділяють загальну залежність X, утримуючи A не утримуватиме X, а видалення B не вдасться "E: Помилка, pkgProblemResolver :: Вирішити згенеровані розриви, це може бути викликано утримуваними пакетами."
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.