Jak sprawić, aby apt-get ignorował niektóre zależności?

86

Jak sprawić, aby apt-get ignorował niektóre zależności? Na przykład chciałem zainstalować mailx, aby móc go używać do wysyłania wiadomości e-mail ze skryptów cron / narzędzi do generowania raportów. Jednak instalacja mailx powoduje również zainstalowanie exim4 i całej gamy zależności (mam już zainstalowany Postfix), których tak naprawdę nie potrzebuję i bez których mailx może istnieć.

Jak zignorować niektóre zależności, ale nadal używać apt-get, ponieważ jest to miłe narzędzie?

FrancisV
źródło
jak instalowany jest postfix? za pośrednictwem pakietu debian? czy zainstalowałeś Postfix ze źródła?
gulasz
Tak, Postfix został zainstalowany ze źródła
FrancisV
3
Pakiet mailx Debiana tylko „poleca” exim4, nie wymaga go. Jeśli nie chcesz instalować zalecanych pakietów, po prostu dodaj APT::Install-Recommends "false";do swojego apt.conf.
żal
Znalazłem satysfakcjonującą odpowiedź na to na unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Odpowiedzi:

45

Proste i łatwe rozwiązanie: po prostu określ niechciane pakiety z dodatkowymi -po każdym z nich.

Przykład bez -przełącznika:

root@debian:~# apt-get install bsd-mailx 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  exim4-base exim4-config exim4-daemon-light liblockfile-bin liblockfile1
[...]

Przykład użycia przełącznika, aby uniknąć instalacji exim4-base . Zwróć uwagę -na końcu:

root@debian:~# apt-get install bsd-mailx exim4-base-
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'exim4-base' is not installed, so not removed
The following extra packages will be installed:
  liblockfile-bin liblockfile1 ssmtp
[...]

Jak widać, apt-getnie próbuje już instalować exim4-basepakietu i nie próbuje instalować różnych zależności ( exim4-configitp.).

A jeśli się myliłeś i exim4-basemimo wszystko potrzebujesz tej zależności, możesz to apt-get installzrobić później!

Zazdrość
źródło
5
Jest to najlepszy sposób na uniknięcie instalacji jakiejkolwiek konkretnej zależności. Inne odpowiedzi albo unikają instalacji wszystkich zależności, odinstalowują zależności po ich zainstalowaniu, albo sugerują żmudną edycję pakietów.
Neil
1
Właśnie tego potrzebowałem! (instalacja gnupg2bez, pinentry-gtk2aby uniknąć X deps)
lapo
To jest naprawdę świetne, jednak w moim przypadku apt-get odmawia instalacji pakietu z „niespełnionymi zależnościami” (które określiłem za pomocą tej metody). W szczególności pakiet dokumentacji o wielkości 100 megabajtów, na którym mi nie zależy.
Rolf
3
Działa tylko z opcjonalnymi zależnościami, a nie z wymaganymi. Błąd rmessage: Depends: xxx but it is not going to be installed. Możesz pominąć wszystkie opcjonalne pakiety za pomocą opcjiapt-get install --no-install-recommends PACKAGE
koppor
Nie działa również z pakietami wirtualnymi. Ale zobacz unix.stackexchange.com/a/404449/23542
artfulrobot
55

Możesz zmienić zależności pakietu deb w następujący sposób:

  1. Rozpakuj deb: ar x golden-linux.deb(utworzy np. Trzy pliki: debian-binary control.tar.gz data.tar.gz)
  2. Rozpakuj archiwum kontroli: tar xzf control.tar.gz(utworzy: postinst postrm preinst prerm md5sums control)
  3. Napraw zależności w control(użyj edytora tekstu)
  4. Zapakuj control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Zapakuj deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(zamówienie ważne! Zobacz [Uwaga])

[Uwaga]: dpkg nie byłby w stanie szybko odczytać metadanych pakietu, gdyby musiał szukać, gdzie kończy się sekcja danych!

Janus Troelsen
źródło
2
Fajnie, rozwiązuje dla mnie szczególny przypadek zależności dla „raring8” do „raring6”, ale ta sama wersja = (, bardzo dziękuję
Felipe Alcacibar
1
Dziękuję też ode mnie; Musiałem tego użyć, ponieważ wymagana była aplikacja, libmng1.so.1mimo że działała idealnie z ustawionym dowiązaniem symbolicznym libmng1.so.2. apt-getpo prostu nie mogłem być zakłopotany i denerwował mnie niezaspokojonymi zależnościami (nawet przy instalacji czegoś zupełnie niezwiązanego!). Co za pomysł na śmieci.
składnia błąd
+1 To zadziałało również dla mnie perfekcyjnie. Pakiet gnome-settings-daemonchciał gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11, ale mam już gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- zauważył”.2" na końcu). Ta procedura pozwoliła mi edytować pakiet i zmusić go do używania nowszej wersji 11.2. DZIĘKUJĘ CI!
Eric Duncan
1
Świetne rozwiązanie, dzięki. Trochę zmodyfikowałem krok 2 i 4: 2., FILES=$(tar zxvf control.tar.gz)aby zapisać listę plików w zmiennej. 4. tar zcf control.tar.gz $FILES- utwórz archiwum w jednym kroku bez potoków i przekierowań, korzystając z oryginalnej listy plików (po modyfikacji).
Brett
2
Kolejna para sugestii. Dla # 4: dodaj --ignore-failed-read, aby tarignorować brakujące pliki z pozostałej części wiersza poleceń. (Na przykład prerm, postrmsą nieobecne w wielu pakietach.) Ponadto, te pliki mogą być .xzraczej niż .gzw nowszych wersjach Debiana formacie archiwum (np data.tar.xz).
Dan Lenski
33

Po zainstalowaniu pakietu z --ignore-depends opcją przejdź do edycji /var/lib/dpkg/statuspliku i usuń zależność, która Twoim zdaniem nie jest potrzebna. Bądź bardzo ostrożny. W celu dep. być wymaganym, jest więcej niż prawdopodobne, że będzie wymagany

Manolis
źródło
3
Po aktualizacji /var/lib/dpkg/statusmoże być konieczne zakończenie instalacji za pomocą sudo apt-get -f install(nie trzeba określać pakietu).
Zmicier Zaleznicenka
Znalezione również tutaj: superuser.com/a/815371/127024 .
Johann
To mnie przeraża, ale działało bezbłędnie!
David Schmitt,
25

Możesz wypróbować --nodepsflagę za pomocą apt-get.
Lub pobierz pakiet i zainstaluj go za dpkgpomocą opcji --ignore-depends.

Na przykład, jeśli chcesz zainstalować pakiet foobez zależności bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Bart De Vos
źródło
52
Którą wersję APT posiadasz? Mój ( 0.8.10 ) nie ma takiej opcji.
tshepang
8
nakazanie dpkg ignorowania zależności nie jest dla niego opcją. Mówi tylko dpkg, aby zignorował zależności dla tej transakcji, a następnie spróbuje zaspokoić te zależności lub usunąć pakiet przy następnej czynności.
gulasz
2
Nadal nie ma szczęścia z APT 0.8.16 BTW. Szkoda, ponieważ wydaje się, że nie ma rozsądnych alternatyw. Z której wersji korzystałeś w 2011 roku, aby to zadziałało?
Christian
2
możesz użyć apt-get download, a następnie dpkg
Frederick Roth
7
--no-install-recommendspracował dla mnie.
Olle Härstedt
14

Ponieważ zainstalowałeś Postfix ze źródła, musisz zainstalować pakiet „fikcyjny”, który zaspokoi zależność mail-transport-agent od mailx (lub bsd-mailx). Pakiet „equivs” w debianie istnieje, aby utworzyć taki fałszywy pakiet, który można zainstalować, aby powiedzieć dpkg „ta zależność jest spełniona”

Powodem, dla którego polecenie dpkg, aby po prostu zignorowało zależności, nie jest dobrym rozwiązaniem, jest to, że mówisz dpkg / apt, aby zignorował je dla pojedynczej transakcji, nie możesz powiedzieć, aby ignorowało zależności na zawsze. Za każdym razem, gdy używasz apt, sprawdza zależności na wszystkich pakietach

gulasz
źródło
2
Zobacz także tę odpowiedź, która prowadzi do samouczka (choć jest zbyt skomplikowany) superuser.com/a/416560/128960 . Krótka wersja to: uruchom equivs-control <name>, edytuj utworzony plik, aby zapewnić odpowiednią zależność i ładną nazwę, a następnie uruchom equivs-build <name>i na końcu dpkg -iuzyskany plik .deb.
Christian
1
IMHO to naprawdę najładniejsze rozwiązanie. Wszystkie inne wymagane tutaj rozwiązania są nieco zbyt hackerskie. Tę czynność należy wykonać tylko raz, a następnie można zainstalować dowolne oprogramowanie, w zależności od oprogramowania samokompilującego się ... Więc głosujmy tę odpowiedź!
rugk 23.04.16
7

Szukałem tej opcji na serwerze Ubuntu 12.04 z systemem Xen. W moich domenach używam jądra -virtual i apt uporczywie próbował instalować grub przy każdej aktualizacji pakietu jądra. Grub nie jest jednak potrzebny wewnątrz domU, gdy używasz p [yv] grub.

Szukałem również opcji -nodeps do apt-get, ale to nie działało, więc skończyło się odinstalowywaniem / usuwaniem grub * po każdej aktualizacji jądra.

W końcu czasami naprawdę pomaga czytanie strony podręcznika man - okazuje się, że podobną opcją apt-get w 12.04 wydaje się być --no-install-poleca, co faktycznie działa w tym przypadku, ponieważ grub jest wymieniony jako „zalecany” w informacje o pakiecie (tak sądzę, więc nie jest to „rzeczywista” zależność?).

Dodam to tutaj, ponieważ w moim przypadku rozwiązało to podobny problem, a podpowiedź do „--no-install-poleca” nie została jeszcze wspomniana.

memartin
źródło
6

Możesz pobrać pakiet za pomocą apt-get, a następnie zainstalować go za pomocą dpkg, ręcznie wymieniając zależność, którą chcesz zignorować.

Na przykład, jeśli chcę pobrać mój pakiet, ale zależy to od biblioteki libperl5.14 i nie chcę instalować biblioteki libperl5.14, ponieważ mam inną wersję, mogę zignorować tę zależność w następujący sposób:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
A.Badger
źródło
Wystarczy wspomnieć, że to sprawi, że będziesz „załamany”. Nie pozwoli ci zainstalować innych pakietów, dopóki nie naprawisz brakującej zależności.
drpexe
6

Alternatywnym sposobem ręcznego dostosowania zależności jest:

apt-get download yourpackage
dpkg-deb -x yourpackage.deb PackageFolder
dpkg-deb --control yourpackage.deb PackageFolder/DEBIAN
vim PackageFolder/DEBIAN/control
dpkg -b PackageFolder yourpackage2.deb
apt-get install ./yourpackage2.deb
AndrewHarvey
źródło
2

W moim systemie Debian, bsd-mailx tak naprawdę zależy default-mta | mail-transport-agent(możesz sprawdzić, od czego zależy pakiet apt-cache show <pkg>dla wszystkiego w archiwum lub dpkg -s <pkg>dla zainstalowanych pakietów.

Możliwe, że Twój pakiet Postfix nie ma, Provides: mail-transport-agentwięc apt nie zdaje sobie sprawy, że masz zainstalowany MTA. Warto byłoby zgłosić błąd, jeśli jest to oficjalna paczka.

Andy
źródło
1

W tym celu możesz po prostu zainstalować gwóźdź, który moim zdaniem nie ma tych zależności?

apt-get install nail
jamespo
źródło
-5

Cóż - nie.

Korzystanie z pracy innych osób jest bardzo ważne na drodze do sukcesu. Kiedy budujesz jakieś oprogramowanie ze źródła (tarball), tracisz okazję do korzystania z pracy menedżera pakietów dystrybucji.

Nie dostaniesz „bezpłatnych” aktualizacji. Przez większość czasu żaden z nich nie aktualizuje pakietów, które zainstalowali ze źródła. Ponieważ muszą śledzić oprogramowanie dla nowych wersji, przebuduj je i wszystkie programy zależne (spróbuj je zapamiętać).

Będziesz miał problemy z innymi pakietami z repozytoriów twojej dystrybucji. Dokładnie tak jest w przypadku pytania: ubuntu ma świetnego menedżera pakietów i kilka bardzo miłych osób obsługujących pakiety. I zdecydowali, że do działania programu mailx potrzebujesz MTA. Więc jeśli zainstalowałeś Postfix ze źródeł, Ubuntu nie poprosiłoby Cię o zainstalowanie exim.

Jeśli z jakiegoś powodu utrzymanie serwera przejdzie na inną osobę (np. Twój projekt odniesie duży sukces i zdecydujesz się zatrudnić innego faceta do zarządzania serwerami, gdy będziesz zajęty innymi rzeczami), naturalnie będzie oczekiwać, że pobierze dpkg --get-selectionswszystkie zainstalowane pakiety.

Spróbuj w jak największym stopniu wykorzystać oprogramowanie do zarządzania pakietami. Naucz się budować własne pakiety, jeśli nie możesz znaleźć jednego z nich, a staniesz się lepszym profesjonalistą.

skarap
źródło