Ignore todas as dependências de um pacote específico com o apt-get

16

Esta é uma pergunta muito específica que o Google não ajudou em responder.

Estou executando o Ubuntu 13.04 com apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Quero instalar o Erlang a partir de um pacote .deb, mas não quero extrair todas as suas dependências. O próprio pacote especifica que depende das bibliotecas Java e wx, mas, na realidade, elas não são necessárias, a menos que você deseje interagir com Java ou wxWidgets.

Eu posso instalar o Erlang assim

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

No entanto, a instalação de qualquer outra coisa apt-getposteriormente falha devido a dependências não atendidas. Portanto, se eu quiser instalar o git após o Erlang, recebo o seguinte

$ 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).

Existe uma maneira de esl-erlangfechar o pacote sem executar apt-get install -f?

Eu quero algo como isto:

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

ou assim:

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

ou isto:

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

Encontrei uma pergunta semelhante: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Algumas respostas fornecem etapas manuais úteis para modificar as dependências de determinados pacotes.

Ainda estou procurando um método automatizado robusto.

andróide
fonte
Você já tentou --nodeps( apt-get) ou --ignore-dependscom dpkg?
Mike Koch

Respostas:

27

Entendo o ponto de vista de bjanssen, mas parece ridículo para um gerente de pacotes permitir --force-dependsuma única instalação de pacote, mas não permitir que a força dependa sempre e pare de me avisar sobre essa dependência.

Eu tive um problema semelhante com um pacote que dependia de uma versão do libcairo ligeiramente superior à versão atualmente disponível no Debian. Para meus propósitos, ainda funciona bem. Fico feliz em continuar usando-o até que a atualização da libcairo apareça no apt. Não quero compilar a partir do código-fonte ou criar meu próprio pacote.

A solução que encontrei:

  • editar /var/lib/dpkg/status,
  • encontre o pacote com as dependências quebradas
  • edite a Depends:linha para parar a reclamação do pacote.

Presumo que será substituído na próxima vez que o pacote for atualizado, mas é exatamente isso que eu quero.

andrew lorien
fonte
2
Isso é perfeito, exatamente o que eu precisava para solucionar temporariamente uma dependência incorreta do PPA!
Cas
2

O que você tenta fazer é contra o objetivo de um gerenciador de pacotes, que tenta manter um ambiente saudável, como você está usando a ferramenta errada para o trabalho. Não tente quebrar o apt-get.

A maneira certa de resolver seu problema é criar seu próprio pacote com dependências adequadas a você. Existe a maneira oficial (bastante envolvida: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) e a maneira rápida e suja de usar apt-build, ou para pacotes que não estão na fonte de distribuição, checkinstall. Todos os pacotes de produção que o apt-get serão instalados com facilidade.

Em uma nota final, você pode questionar a sabedoria do mantenedor do esl-erlang para incluir certas dependências, mas não pode culpar o gerenciador de pacotes pelo comportamento pretendido. Se você acha que essas dependências estão erradas, deve registrar um erro no pacote.

bjanssen
fonte
O que você disse sobre o "objetivo de um gerenciador de pacotes" é basicamente verdadeiro, mas você também não deve generalizar. Eu gostaria de dar um exemplo: é necessário um aplicativo libmng1. Mas eu tinha libmng2instalado E um link simbólico definido como libmng1.so. Trabalhou uma ameaça, nunca teve problemas. Mas apt-getsempre reclamou de "dependências não atendidas". Definitivamente, há uma boa razão para tentar encontrar uma maneira de silenciar a aptidão a esse respeito. Desde que as coisas fazer o trabalho, ele simplesmente continua reclamando por coisas que simplesmente são nenhum problema. Apenas vê problemas onde eles não são nenhum. E isso é chato.
Syntaxerror 15/12/14
Esta é uma situação curiosa. Eu acho que você instalou um pacote de um repositório que não é de distribuição? Nesse caso, dê uma olhada no equivs"silenciamento" do apt-get sem quebrá-lo.
precisa saber é o seguinte
Bem, poderia ter sido assim. Mas, na verdade, não era ... simplesmente instalei o pacote mais antigo da mesma distribuição, então, nos termos do Ubuntu, eu estava no 15.x, mas instalei o libmng1 a partir do 12.04 LTS.
Syntaxerror 18/04
0

Verifique se o "proxy usado" no apt.confé adequado (ou seja, de acordo com a sua rede). Isso também causa esses problemas, pois os URLs seriam inacessíveis.

Normalmente, se você estiver usando proxy, /etc/apt/apt.confserá o seguinte:

Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";
parasita
fonte