Come ottengo apt-get per ignorare alcune dipendenze?


86

Come faccio ad apt-get ignorare alcune dipendenze? Ad esempio, volevo installare mailx in modo da poterlo utilizzare per inviare e-mail da cron script / strumenti per la generazione di report. Tuttavia, l'installazione di Mailx installa anche exim4 e un sacco di dipendenze (ho già installato Postfix) di cui non ho davvero bisogno e di cui credo che Mailx possa anche vivere senza.

Come faccio ad ignorare alcune dipendenze ma utilizzo ancora apt-get poiché è uno strumento utile?


come è installato postfix? tramite il pacchetto debian? o hai installato postfix dal sorgente?
Spezzatino il

Sì, Postfix è stato installato dalla fonte
FrancisV

3
Il pacchetto mailx di Debian 'raccomanda' solo exim4, non lo richiede. Se non si desidera installare i pacchetti consigliati, è sufficiente aggiungerlo APT::Install-Recommends "false";al proprio apt.conf.
ruief

Ho trovato una risposta soddisfacente a questo su unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Risposte:


45

Soluzione semplice e facile: basta specificare i pacchetti indesiderati con un extra -dopo ognuno di essi.

Esempio senza -interruttore:

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
[...]

Esempio di utilizzo dell'interruttore per evitare l'installazione exim4-base . Si noti -alla fine:

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
[...]

Come puoi vedere, apt-getnon tenta più di installare il exim4-basepacchetto e non tenta di installare le sue varie dipendenze ( exim4-configecc.).

E se exim4-basedopo tutto avevi torto e avevi bisogno di quella dipendenza, puoi apt-get installfarlo dopo!


5
Questo è il modo migliore per evitare l'installazione di dipendenze specifiche. Le altre risposte evitano di installare tutte le dipendenze, disinstallano le dipendenze dopo che sono state installate o suggeriscono di modificare noiosamente i pacchetti.
Neil,

1
Questo era esattamente quello di cui avevo bisogno! (installazione gnupg2senza pinentry-gtk2per evitare X deps)
lapo

Questo è davvero fantastico, tuttavia, nel mio caso apt-get rifiuta di installare il pacchetto con "dipendenze non soddisfatte" (che ho specificato usando questo metodo). In particolare un pacchetto di documentazione da 100 megabyte che non mi interessa.
Rolf,

3
Funziona solo con dipendenze opzionali, non con quelle necessarie. Errore rmessage: Depends: xxx but it is not going to be installed. Puoi saltare tutti i pacchetti opzionali conapt-get install --no-install-recommends PACKAGE
koppor il

Inoltre non funziona con i pacchetti virtuali. Ma vedi unix.stackexchange.com/a/404449/23542
artfulrobot

55

È possibile modificare le dipendenze di un pacchetto deb in questo modo:

  1. Decomprimi deb: ar x golden-linux.deb(creerà cioè tre file: debian-binary control.tar.gz data.tar.gz)
  2. Scompatta archivio controllo: tar xzf control.tar.gz(creerà: postinst postrm preinst prerm md5sums control)
  3. Correggi le dipendenze in control(usa un editor di testo)
  4. Repack control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Repack deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(ordine importante! Vedi [Nota])

[Nota]: dpkg non sarebbe in grado di leggere rapidamente i metadati di un pacchetto se dovesse cercare dove era finita la sezione dati!


2
Bello, mi risolve un caso speciale di dipendenze da "raring8" a "raring6" ma la stessa versione = (, molto grazie
Felipe Alcacibar,

1
Grazie anche a me; Ho dovuto usare questo perché un'applicazione richiedeva libmng1.so.1anche se funzionava perfettamente con un symlink impostato su libmng1.so.2. apt-getsemplicemente non poteva essere messo la museruola e continuava a infastidirmi per le dipendenze non soddisfatte (anche quando si installa qualcosa di totalmente indipendente!). Che carico di rifiuti.
syntaxerror,

+1 Questo ha funzionato perfetto anche per me. Il pacchetto gnome-settings-daemonvoleva gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11ma l'ho già fatto gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- notare ".2" alla fine). Questa procedura mi ha permesso di modificare il pacchetto e forzarlo a utilizzare la versione 11.2 più recente. GRAZIE!
Eric Duncan,

1
Ottima soluzione, grazie. Ho modificato un po 'i passaggi 2 e 4: 2. FILES=$(tar zxvf control.tar.gz)per memorizzare l'elenco dei file in una variabile. 4. tar zcf control.tar.gz $FILES- creare l'archivio in un unico passaggio senza pipe o reindirizzamenti utilizzando l'elenco di file originale (dopo la modifica).
Brett,

2
Un'altra coppia suggerisce. Per # 4: aggiungi in --ignore-failed-readmodo che tarignori i file mancanti dal resto della riga di comando. (Per esempio, prerm, postrmsono assenti da molti pacchetti.) Inoltre, i tarball possono essere .xzpiuttosto che .gznelle versioni più recenti del formato di archivio Debian (per esempio data.tar.xz).
Dan Lenski,

33

Dopo aver installato il pacchetto con l' --ignore-depends opzione, vai e modifica il /var/lib/dpkg/statusfile e rimuovi qualsiasi dipendenza che ritieni non sia necessaria. Stai molto attento. Per un dep. ad essere richiesto, è più che probabile che ESSERE richiesta


3
Dopo l'aggiornamento /var/lib/dpkg/statuspotrebbe essere necessario completare l'installazione con sudo apt-get -f install(non è necessario specificare un pacchetto).
Zmicier Zaleznicenka,

Anche trovato qui: superuser.com/a/815371/127024 .
Johann,

Questo mi dà i brividi, ma ha funzionato perfettamente!
David Schmitt,

25

Puoi provare la --nodepsbandiera con apt-get.
Oppure scarica il pacchetto e installalo utilizzando dpkgcon l'opzione --ignore-depends.

Ad esempio, se si desidera installare il pacchetto foosenza dipendenza bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb

52
Quale versione di APT hai? Il mio ( 0.8.10 ) non ha tale opzione.
Tshepang,

8
dire a dpkg di ignorare le dipendenze non è un'opzione per lui. Dice solo a dpkg di ignorare le dipendenze per QUESTA transazione, proverà quindi a soddisfare le dipendenze o a rimuovere il pacakge alla successiva operazione.
Spezzatino il

2
Ancora nessuna fortuna con APT 0.8.16 BTW. Peccato perché non sembrano esserci alternative ragionevoli. Quale versione hai usato nel 2011 per farlo funzionare?
Christian,

2
puoi usare apt-get download e poi dpkg
Frederick Roth

7
--no-install-recommendsha funzionato per me.
Olle Härstedt,

14

Poiché hai installato postfix dal sorgente, devi installare un pacchetto "fittizio" che soddisferà la dipendenza da mailx (o bsd-mailx) di agente di trasporto posta. Il pacchetto "equivs" in debian esiste per creare un pacchetto così fittizio che puoi installare per dire a dpkg "questa dipendenza è soddisfatta"

Il motivo per cui dire a dpkg di ignorare semplicemente le dipendenze non è una buona soluzione, è che stai solo dicendo a dpkg / apt di ignorarlo per una singola transazione, non puoi dirgli di ignorare le dipendenze per sempre. Ogni volta che usi apt controlla le dipendenze da tutti i pacchetti


2
Vedi anche questa risposta che rimanda a un tutorial (anche se è eccessivamente complesso) superuser.com/a/416560/128960 . La versione breve è: esegui equivs-control <name>, modifica il file prodotto per fornire la giusta dipendenza e avere un bel nome, quindi esegui equivs-build <name>e infine dpkg -iil file .deb risultante.
Christian,

1
IMHO questa è davvero la soluzione più bella. Tutte le altre soluzioni richieste qui sono un po 'troppo elaborate. Questo deve essere fatto solo una volta e puoi installare qualsiasi software a seconda del software autocompilato in seguito ... Quindi votiamo questa risposta!
rugk,

7

Ho cercato questa opzione su un server Ubuntu 12.04 con Xen. Nei miei domini uso il kernel virtuale, e apt ha cercato in modo persistente di installare grub ad ogni aggiornamento del pacchetto del kernel. Grub tuttavia non è necessario all'interno di domU quando si utilizza p [yv] grub.

Ho cercato anche l'opzione -nodeps per apt-get, ma non ha funzionato, quindi ho finito per disinstallare / eliminare grub * dopo ogni aggiornamento del kernel.

Dopotutto, leggere davvero una pagina man aiuta a volte - risulta che un'analoga opzione apt-get su 12.04 sembra essere --no-install-recommend, che in realtà funziona in questo caso, poiché grub è elencato come 'raccomandato' nella informazioni sul pacchetto (suppongo che non sia una dipendenza "reale"?).

Lo sto aggiungendo qui perché nel mio caso ha risolto un problema simile e il suggerimento per "--no-install-recommend" non è stato ancora menzionato.


6

È possibile scaricare il pacchetto con apt-get e quindi installarlo con dpkg, elencando manualmente la dipendenza che si desidera ignorare.

Ad esempio, se voglio scaricare il mypackage ma dipende da libperl5.14 e non voglio installare libperl5.14 poiché ho una versione diversa, posso ignorare questa dipendenza come segue:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb

Solo per dire che questo ti lascerà adatto "rotto". Non ti permetterà di installare altri pacchetti fino a quando non riparerai la dipendenza mancante.
drpexe,

6

Un modo alternativo per modificare manualmente le dipendenze è:

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

2

Sul mio sistema debian, bsd-mailx dipende in realtà default-mta | mail-transport-agent(puoi controllare da cosa dipende un pacchetto apt-cache show <pkg>per qualsiasi cosa nell'archivio o dpkg -s <pkg>per i pacchetti installati.

È possibile che il tuo pacchetto postfix non abbia Provides: mail-transport-agentcosì apt che non si rende conto che hai un MTA installato. Vale la pena presentare un bug per questo se si tratta di un pacchetto ufficiale.


1

Ai fini di questo, potresti semplicemente installare un chiodo che non credo abbia queste dipendenze?

apt-get install nail

-5

Bene - non farlo.

L'uso del lavoro di altre persone è molto importante sulla strada per qualsiasi successo. Quando si crea un software dal sorgente (tarball), si perde l'opportunità di utilizzare il lavoro del gestore dei pacchetti della distro.

Non otterrai aggiornamenti "gratuiti". Il più delle volte nessuno aggiorna mai i pacchetti installati dal sorgente. Perché devono tenere traccia del software per le nuove versioni, ricostruirlo e tutti i programmi dipendenti (prova a ricordarli).

Avrai problemi con altri pacchetti dai repository della tua distribuzione. Questo è esattamente il caso indicato nella domanda: ubuntu ha un ottimo gestore di pacchetti e alcune persone molto simpatiche mantengono i pacchetti. E hanno deciso che per far funzionare il programma mailx è necessario un MTA. Quindi se hai installato postfix da fonti ubuntu non ti chiederebbe di installare exim.

Se per qualche motivo la manutenzione del server passa ad un'altra persona (ad es. Il tuo progetto diventa molto efficace e decidi di assumere un altro ragazzo per gestire i server mentre sei impegnato con altre cose) si aspetterà naturalmente di correre dpkg --get-selectionsper ottenere tutto il pacchetti installati.

Prova a utilizzare il software di gestione dei pacchetti della distro il più possibile. Impara a costruire i tuoi pacchetti se non riesci a trovarne uno predefinito e diventerai un professionista migliore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.