W pierwszej odsłonie pokazałem jak można wykorzystać dpkg-buildpackage w praktyce w przypadku konfliktów zależności. Jak sam tytuł mówi, dziś będzie o tym samym, tylko z wykorzystaniem innych narzędzi i sposobów. Do dzieła (:
Przy niedawnej aktualizacji systemu, otrzymałem następujący komunikat:
The following packages will be REMOVED: deluge-torrent gedit libwnck18 notification-daemon python-gnome2-desktop The following NEW packages will be installed: libwnck22 The following packages will be upgraded: libwnck-common libwnck-dev 2 upgraded, 1 newly installed, 5 to remove and 0 not upgraded.
Nie spodobało mi się to z kilku względów: 1) wywala mi gEdita; 2) wywala mi Deluge; 3) nie wiem dlaczego. Puściłem aktualizację i postanowiłem się temu lepiej przyjrzeć.
Na sam początek, chciałem się dowiedzieć co blokuje instalację gedita:
sudo apt-get install gedit
The following packages have unmet dependencies: gedit: Depends: python-gnome2-desktop (>= 2.15.90) but it is not going to be installed E: Broken packages
No dobrze, więc co blokuje instalację python-gnome2-desktop?
sudo apt-get install python-gnome2-desktop
The following packages have unmet dependencies: python-gnome2-desktop: Depends: libwnck18 (>= 2.18.2) but it is not going to be installed E: Broken packages
Ach, więc w tym problem. libwnck22 zastąpiło libwnck18 i pojawiły się komplikacje. Zerknijmy na konkrety:
sudo apt-get install libwnck18
The following packages have unmet dependencies: libwnck18: Depends: libwnck-common (< 2.19) but 2.20.0-1 is to be installed E: Broken packages
W sumie wszystko jasne. To, czego potrzebuje python-gnome2-desktop, to starsza wersja libwnck, mając python-gnome2-desktop, można zainstalować gedita i deluge, na których to mi zależy. Co więc należy zrobić? Na sam początek, sprawdzić jakie wersje są zainstalowane w systemie:
dpkg -l |grep ii |grep libwnck
ii libwnck-common 2.20.0-1 Window Navigator Construction Kit - common f ii libwnck-dev 2.20.0-1 Window Navigator Construction Kit - developm ii libwnck22 2.20.0-1 Window Navigator Construction Kit - runtime
OK, wypadałoby jeszcze sprawdzić “układ” paczek:
apt-cache policy libwnck18
libwnck18:
Installed: (none)
Candidate: 2.18.3-1
Version table:
2.18.3-1 0
500 ftp://ftp.de.debian.org testing/main Packages
100 /var/lib/dpkg/status
Oraz:
apt-cache policy libwnck-common
libwnck-common:
Installed: 2.20.0-1
Candidate: 2.20.0-1
Version table:
*** 2.20.0-1 0
500 ftp://ftp.de.debian.org sid/main Packages
100 /var/lib/dpkg/status
2.18.3-1 0
500 ftp://ftp.de.debian.org testing/main Packages
Czas zacząć działać. Na dobry początek, trzeba usunąć posiadane w systemie libwnck:
sudo apt-get remove libwnck22 libwnck-common libwnck-dev
Teraz trzeba zainstalować tę starszą wersję, libwnck18. Wiadomo, że znajduje się w repozytorium testing, a APT domyślnie instaluje najnowszą możliwą wersję (czyli libwnck22 z unstable). Dlatego “apt-get install” musi zostać napisane z odpowiednim “uzpełnieniem”:
sudo apt-get install libwnck18 --target-release=testing
Teraz swobodnie można by zainstalować paczki gedit i deluge, ale zaraz przy następnej aktualizacji znów zostaną usunięte wymagane paczki i cała operacja pójdzie na marne. Tu z pomocą przychodzi “przypinanie” danych wersji w systemie. W celu zachowania pewnych paczek/bibliotek w danych wersjach w systemie, należy utworzyć i odpowiednio wypełnić plik /etc/apt/preferences:
sudo gedit /etc/apt/preferences
Package: libwnck18 Pin: version 2.18* Pin-Priority: 1001 Package: libwnck-common Pin: version 2.18* Pin-Priority: 1001
Od tego momentu bez obaw można przeprowadzać aktualizację systemu. Należy tylko pamiętać, że wcześniej czy później paczki takie jak python-gnome2-desktop etc. zostaną zaktualizowane do używania libwnck22. Wtedy swobodnie można usunąć plik /etc/apt/preferences (:
Zazwyczaj takie błędy są automagicznie naprawiane przez developerów paczek i maksymalnie po kilku dniach pojawiają się zaktualizowane pakiety. Jednak sam sposób jest całkiem ok, tylko że wydaje mi się niepotrzebny.. Można wymusić instalację paczki bez jej zależności.
Z systemem się nie walczy, systemowi się ulega :)
Ja w takich wypadkach robię jedną z dwóch rzeczy :
- czekam, aż w repozytoriach pojawią się spełnione wszystkie zależności
- sprawdzam, czy do spełnienia zależności nie ma paczek w experimental (docelowo instaluję z unstable)
Jak żadne z powyższych nie zadziała, nie kombinuję, bo pogoda ładna a człowiekowi lata lecą :)