Ignora tutte le dipendenze per un pacchetto specifico con apt-get


16

Questa è una domanda molto specifica a cui Google non ha aiutato a rispondere.

Sto eseguendo Ubuntu 13.04 con apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Voglio installare Erlang da un pacchetto .deb, ma non voglio estrarre tutte le sue dipendenze. Il pacchetto stesso specifica che dipende dalle librerie Java e wx, ma in realtà quelle non sono necessarie a meno che non si desideri interfacciarsi con Java o wxWidgets.

Posso installare Erlang in questo modo

sudo dpkg -i --force-depends erlang.deb

Tuttavia, l'installazione di qualsiasi altra cosa apt-getsuccessiva non riesce a causa di dipendenze non soddisfatte. Quindi, se voglio installare git dopo Erlang, ottengo quanto segue

$ sudo apt-get install -y git
Reading package lists...
Building dependency tree...
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 esl-erlang : Depends: default-jre-headless but it is not going to be installed or
                       java2-runtime-headless or
                       java1-runtime-headless or
                       java2-runtime or
                       java1-runtime
              Depends: libwxbase2.8-0 but it is not going to be installed
              Depends: libwxgtk2.8-0 but it is not going to be installed
              Recommends: erlang-mode but it is not going to be installed
 git : Depends: libcurl3-gnutls (>= 7.16.2-1) but it is not going to be installed
       Depends: perl-modules but it is not going to be installed
       Depends: liberror-perl but it is not going to be installed
       Depends: git-man (> 1:1.7.9.5) but it is not going to be installed
       Depends: git-man (< 1:1.7.9.5-.) but it is not going to be installed
       Recommends: patch
       Recommends: rsync
       Recommends: ssh-client
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

C'è un modo per far esl-erlangtacere il pacchetto senza eseguirlo apt-get install -f?

Voglio qualcosa del genere:

sudo apt-get install --ignore-deps-for-package=esl-erlang git

o in questo modo:

sudo apt-cache shut-package-up esl-erlang

o questo:

sudo apt-get download git
sudo dpkg -i --with-deps git.deb

Ho trovato una domanda simile: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Un paio di risposte forniscono utili passaggi manuali per modificare le dipendenze di determinati pacchetti.

Sto ancora cercando un metodo automatizzato robusto.


Hai provato --nodeps( apt-get) o --ignore-dependscon dpkg?
Mike Koch,

Risposte:


27

Capisco il punto di Bjanssen, ma sembra ridicolo per un gestore di pacchetti consentire l' --force-dependsinstallazione di un singolo pacchetto, ma non consentire che la forza dipenda per sempre e smetta di avvertirmi di questa dipendenza.

Ho avuto un problema simile con un pacchetto che dipendeva da una versione di libcairo leggermente superiore a quella attualmente disponibile in Debian. Per i miei scopi funziona ancora bene. Sono felice di continuare a usarlo fino a quando l'aggiornamento di libcairo appare in apt. Non voglio compilare dal sorgente o creare il mio pacchetto.

La soluzione che ho trovato:

  • modifica /var/lib/dpkg/status,
  • trova il pacchetto con le dipendenze rotte
  • modifica la Depends:riga per interrompere il reclamo del pacchetto.

Presumo che verrà sovrascritto al prossimo aggiornamento del pacchetto, ma è esattamente quello che voglio.


2
Questo è perfetto, proprio quello di cui avevo bisogno per risolvere temporaneamente una dipendenza PPA errata!
Cas

2

Quello che provi a fare è contro lo scopo di un gestore di pacchetti, che cerca di mantenere un ambiente sano, ma stai usando lo strumento sbagliato per il lavoro. Non tentare di interrompere apt-get.

Il modo giusto per risolvere il problema è creare un pacchetto personalizzato con dipendenze adatte a te. C'è il modo ufficiale (abbastanza coinvolto: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) e il modo rapido e sporco che utilizza apt-build, o per i pacchetti che non sono nella fonte di distribuzione, checkinstall. Tutti i pacchetti di produzione apt-get si installeranno felicemente.

In una nota finale, potresti mettere in dubbio la saggezza del manutentore di esl-erlang di includere determinate dipendenze, ma non puoi criticare il gestore pacchetti per il comportamento previsto. Se ritieni che queste dipendenze siano errate, dovresti presentare un bug con il pacchetto.


Quello che hai detto sullo "scopo di un gestore di pacchetti" è sostanzialmente vero, ma non dovresti generalizzare neanche. Vorrei fare un esempio: è necessaria un'applicazione libmng1. Ma avevo libmng2installato E un symlink impostato su libmng1.so. Ha funzionato una minaccia, non ha mai avuto problemi. Ma mi sono apt-getsempre lamentato di "dipendenze non soddisfatte". Quindi c'è sicuramente una buona ragione per cercare di trovare un modo per mettere a tacere l'attitudine in questo senso. Dal momento che le cose fanno il lavoro, ma continua a lamentarsi per le cose che semplicemente sono un problema. Vede solo problemi dove non ce ne sono. E questo è fastidioso.
syntaxerror,

Questa è una situazione curiosa. Immagino tu abbia installato un pacchetto da un repository non di distribuzione? In tal caso, dai un'occhiata a equivs"silenziare" apt-get senza romperlo.
bjanssen,

Beh, avrebbe potuto essere così. Ma in realtà non lo era ... Ho semplicemente installato il vecchio pacchetto dalla stessa distribuzione, quindi in termini di Ubuntu ero su 15.x, ma ho installato libmng1 da 12.04 LTS.
syntaxerror,

0

Verificare se il "proxy utilizzato" in apt.confè corretto (ovvero in conformità con la propria rete). Ciò causa anche tali problemi, poiché gli URL sarebbero irraggiungibili.

In genere, se si utilizza il proxy, il tuo /etc/apt/apt.confaspetto sarebbe simile a:

Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";
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.