Como faço para o apt-get ignorar algumas dependências?

86

Como faço para o apt-get ignorar algumas dependências? Por exemplo, eu queria instalar o mailx para poder usá-lo para enviar email de scripts cron / ferramentas de geração de relatórios. No entanto, a instalação do mailx também instala o exim4 e um monte de dependências (eu já tenho o Postfix instalado) que eu realmente não preciso e que acho que o mailx também pode viver sem.

Como ignoro algumas dependências, mas ainda uso o apt-get, pois é uma boa ferramenta?

FrancisV
fonte
como o postfix está instalado? através do pacote debian? ou você instalou o postfix da fonte?
ensopado de
Sim, o Postfix foi instalado a partir da fonte
FrancisV 23/03
3
O pacote mailx do Debian apenas recomenda o exim4, não requer. Se você não deseja instalar os pacotes recomendados, basta adicionar APT::Install-Recommends "false";ao seu apt.conf.
ruief
Encontrei uma resposta satisfatória para isso em unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Respostas:

45

Solução simples e fácil: basta especificar os pacotes indesejados com um extra -após cada um deles.

Exemplo sem a -chave:

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

Exemplo usando o switch para evitar a instalação exim4-base . Observe o -no final:

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

Como você pode ver, apt-getnão tenta mais instalar o exim4-basepacote, nem tenta instalar suas várias dependências ( exim4-configetc).

E se você estava errado e precisava dessa exim4-basedependência, afinal, você pode justificá- apt-get installla mais tarde!

Jealie
fonte
5
Essa é a melhor maneira de evitar a instalação de qualquer dependência específica. As outras respostas evitam instalar todas as dependências, desinstalam as dependências após a instalação ou sugerem a edição tediosa de pacotes.
1111 Neil
11
Era exatamente disso que eu precisava! (instalação gnupg2sem pinentry-gtk2a evitar deps X)
Lapo
Isso é realmente ótimo, no entanto, no meu caso, o apt-get se recusa a instalar o pacote com "dependências não atendidas" (que eu especifiquei usando esse método). Especificamente, um pacote de documentação de 100 megabytes que eu não ligo.
Rolf
3
Funciona apenas com dependências opcionais, não com as necessárias. Rmessage erro: Depends: xxx but it is not going to be installed. Você pode pular todos os pacotes opcionais comapt-get install --no-install-recommends PACKAGE
koppor
Também não funciona com pacotes virtuais. Mas veja unix.stackexchange.com/a/404449/23542
artfulrobot
55

Você pode alterar as dependências de um pacote deb como este:

  1. Descompacte deb: ar x golden-linux.deb(criará três arquivos: debian-binary control.tar.gz data.tar.gz)
  2. Descompacte o arquivo de controle: tar xzf control.tar.gz(criará: postinst postrm preinst prerm md5sums control)
  3. Corrigir dependências em control(use um editor de texto)
  4. Reembalar control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Reembale novamente deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(peça importante! Consulte [Nota])

[Nota]: o dpkg não seria capaz de ler os metadados de um pacote rapidamente se tivesse que procurar onde a seção de dados terminava!

Janus Troelsen
fonte
2
Bom, ele resolve me um caso especial de dependências para "raring8" para "raring6", mas a mesma versão = (, muito graças
Felipe Alcacibar
11
Obrigado de mim também; Eu tive que usar isso porque um aplicativo era necessário, libmng1.so.1mesmo que funcionasse perfeitamente com um link simbólico definido como libmng1.so.2. apt-getsimplesmente não podia ser amordaçado e ficava me irritando com dependências não atendidas (mesmo ao instalar algo totalmente não relacionado!). Que carga de conceito de lixo.
Syntaxerror 15/12/14
+1 Isso funcionou perfeito para mim também. Pacote gnome-settings-daemondesejado, gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11mas eu já tenho gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- observe o ".2" no final). Este procedimento me permitiu editar o pacote e forçá-lo a usar a versão 11.2 mais recente. OBRIGADO!
Eric Duncan
11
Ótima solução, obrigado. Modifiquei as etapas 2 e 4 um pouco: 2. FILES=$(tar zxvf control.tar.gz)para armazenar a lista de arquivos em uma variável. 4. tar zcf control.tar.gz $FILES- crie o arquivo em uma única etapa, sem canais ou redirecionamentos, usando a lista de arquivos original (após a modificação).
Brett
2
Mais algumas sugestões. Para o nº 4: adicione --ignore-failed-readpara que tarignore os arquivos ausentes do restante da linha de comando. (Por exemplo, prerm, postrmestão ausentes de muitos pacotes.) Além disso, os tarballs pode ser .xzmais do que .gzem versões mais recentes do formato de arquivo Debian (por exemplo data.tar.xz).
quer
33

Depois de instalar o pacote com a --ignore-depends opção, edite o /var/lib/dpkg/statusarquivo e remova qualquer dependência que julgue desnecessária. Apenas tenha muito cuidado. Em ordem um dep. de ser necessário, é mais do que provável a SER necessário

Manolis
fonte
3
Após a atualização /var/lib/dpkg/status, pode ser necessário concluir a instalação sudo apt-get -f install(não é necessário especificar um pacote).
Zmicier Zaleznicenka
Também encontrado aqui: superuser.com/a/815371/127024 .
Johann
Isso me dá arrepios, mas funcionou perfeitamente!
David Schmitt
25

Você pode tentar a --nodepsbandeira com apt-get.
Ou baixar o pacote e instalá-lo usando dpkga opção --ignore-depends.

Por exemplo, se você deseja instalar o pacote foosem dependência bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Bart De Vos
fonte
52
Qual versão do APT você possui? O meu ( 0.8.10 ) não tem essa opção.
tshepang
8
dizer ao dpkg para ignorar as dependências não é uma opção para ele. Ele diz apenas ao dpkg para ignorar as dependências dessa transação, e tentará satisfazer as dependências ou remover o pacakge na próxima vez que você fizer alguma coisa.
ensopado de
2
Ainda sem sorte com o APT 0.8.16 BTW. Pena que não parece haver alternativas razoáveis. Qual versão você usou em 2011 para fazer isso funcionar?
Christian
2
você pode usar o apt-get de download e, em seguida dpkg
Frederick Roth
7
--no-install-recommendstrabalhou para mim.
Olle Härstedt 13/10
14

Desde que você instalou o postfix a partir da fonte, é necessário instalar um pacote "fictício" que satisfaça a dependência do agente de transporte de correio do mailx (ou bsd-mailx). O pacote "equivs" no debian existe para criar um pacote fictício que você pode instalar para informar ao dpkg "essa dependência é satisfeita"

O motivo pelo qual dizer ao dpkg para simplesmente ignorar dependências não é uma boa solução, é porque você está dizendo apenas ao dpkg / apt para ignorá-lo por uma única transação, não é possível dizer para ele ignorar as dependências para sempre. Sempre que você usa o apt, ele verifica as dependências de todos os pacotes

ensopado
fonte
2
Consulte também esta resposta que contém links para um tutorial (embora seja excessivamente complexo) superuser.com/a/416560/128960 . A versão curta é: execute equivs-control <name>, edite o arquivo produzido para fornecer a dependência correta e tenha um bom nome, depois execute equivs-build <name>e, finalmente, dpkg -io arquivo .deb resultante.
Christian
11
IMHO esta é realmente a melhor solução. Todas as outras soluções solicitadas aqui são um pouco imprudentes. Este só precisa ser feito uma vez e você pode instalar qualquer software, dependendo do software auto-compilado posteriormente ... Então, vamos votar esta resposta!
rugk
7

Eu estive procurando por esta opção em um servidor Ubuntu 12.04 executando o Xen. Nos meus domínios, uso o kernel -virtual, e o apt tentou persistentemente instalar o grub a cada atualização do pacote do kernel. Entretanto, o Grub não é necessário dentro do domU ao usar o p [yv] grub.

Eu estive procurando pela opção -nodeps para o apt-get também, mas ela não funcionou, então acabei desinstalando / limpando o grub * após cada atualização do kernel.

Afinal, realmente ler uma página de manual às vezes ajuda - acontece que uma opção semelhante ao apt-get na versão 12.04 parece ser --no-install-recommends, que realmente funciona nesse caso, pois o grub é listado como 'recomendado' no diretório informações do pacote (acho que não é uma dependência "real"?).

Estou adicionando isso aqui porque, no meu caso, ele resolveu um problema semelhante, e a dica para '--no-install-recommends' ainda não foi mencionada.

memartin
fonte
6

Você pode baixar o pacote com o apt-get e instalá-lo com o dpkg, listando manualmente a dependência que você gostaria de ser ignorada.

Por exemplo, se eu quiser fazer o download do mypackage, mas ele depende da libperl5.14 e não quero instalar a libperl5.14, pois tenho uma versão diferente, posso ignorar essa dependência da seguinte maneira:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
A.Badger
fonte
Apenas para mencionar que isso deixará você apto "quebrado". Não permitirá que você instale outros pacotes até que você corrija a dependência ausente.
amigos estão dizendo sobre drpexe
6

Uma maneira alternativa de ajustar manualmente as dependências é:

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
fonte
2

No meu sistema debian, o bsd-mailx realmente depende default-mta | mail-transport-agent(você pode verificar o que um pacote depende apt-cache show <pkg>para qualquer coisa no arquivo ou dpkg -s <pkg>para os pacotes instalados.

Pode ser que o seu pacote postfix não possua, Provides: mail-transport-agentportanto o apt não percebe que você possui um MTA instalado. Valeria a pena registrar um bug para isso, se for um pacote oficial.

Andy
fonte
1

Para isso, você pode instalar unha, que eu acho que não tem essas dependências?

apt-get install nail
jamespo
fonte
-5

Bem - não.

Usar o trabalho de outras pessoas é muito importante no caminho para qualquer sucesso. Ao criar algum software a partir da fonte (tarball), você perde a oportunidade de usar o trabalho do gerenciador de pacotes da distribuição.

Você não receberá atualizações "gratuitas". Na maioria das vezes, nenhum deles atualiza os pacotes que eles instalaram da fonte. Como eles precisam rastrear o software para novas versões, reconstrua-o e todos os programas dependentes (tente se lembrar deles).

Você terá problemas com outros pacotes dos repositórios de distribuição da sua distribuição. Este é exatamente o caso indicado na pergunta: o ubuntu tem um ótimo gerenciador de pacotes e algumas pessoas muito legais mantendo os pacotes. E eles decidiram que, para o programa mailx funcionar, você precisa de um MTA. Portanto, se você instalou o postfix a partir de fontes, o ubuntu não solicitará a instalação do exim.

Se, por algum motivo, a manutenção do servidor for transferida para outra pessoa (por exemplo, seu projeto se tornar muito bem-sucedido e você decidir contratar outro gerente para gerenciar os servidores enquanto estiver ocupado com outras coisas), ele naturalmente esperará executar dpkg --get-selectionspara obter todas as informações necessárias. pacotes instalados.

Tente usar o software de gerenciamento de pacotes da distribuição o máximo possível. Aprenda a criar seus próprios pacotes, se você não encontrar um pré-construído e se tornar um profissional melhor.

skarap
fonte