Por que o apt-get instala uma dependência mais nova que a suportada pelo pacote especificado?

5

Encontrei um problema em que um pacote, em uma versão específica, requer outro pacote, também em uma versão específica, mas o Apt-Get seleciona uma versão mais recente da dependência e, em seguida, falha.

Eu experimentei isso com o MCollective do Puppet Lab e os PPAs Nginx Mainline e outros pacotes, então minha pergunta é sobre a abordagem geral para a resolução de dependências do Apt-Get, mas vou usar o Nginx como meu exemplo.

Eu tenho um espelho de pacote (construído com o Aptly) contendo a v1.7.5 do pacote nginx-full e todas as suas dependências e também o pacote v1.7.6 mais novo e todas as suas dependências.

Se eu executar apt-get install nginx-full=1.7.5-1+trusty1 , a instalação falhará com a mensagem:

The following packages have unmet dependencies:
 nginx-full : Depends: nginx-common (= 1.7.5-1+trusty1) but 1.7.6-1+trusty1 is to be installed

No entanto, se eu executar apt-get install nginx-full=1.7.5-1+trusty1 nginx-common=1.7.5-1+trusty1 , a instalação é bem-sucedida.

Quando eu tenho ambas as versões 1.7.5 e 1.7.6 do pacote nginx-common no espelho e o pacote nginx-full explicitamente indica que ele requer 1.7.5 de nginx-common, e nginx-full é o pacote I tenho perguntado, por que o apt-get ainda seleciona a versão 1.7.6 incompatível do nginx-common?

Aqui está a saída de dpkg -s nginx-full após a instalação da versão 1.7.5, mostrando a restrição de dependência de versão exata:

Version: 1.7.5-1+trusty1
Depends: nginx-common (= 1.7.5-1+trusty1), libc6 (>= 2.14), ...

Nesse caso, a cadeia de versões exatas necessária é curta, então a solução alternativa é fácil, mas há pelo menos dois problemas para mim:

  1. Outros pacotes possuem cadeias de dependências muito mais longas que são tediosas para serem descobertas e anexadas à linha de comandos do apt-get.
  2. Até que uma versão mais recente de uma dependência seja publicada em um espelho de pacote, é fácil não estar ciente do problema iminente.

O que não consigo compreender é por que a resolução de dependência aparentemente ignora a restrição de versão exata no pacote especificado. Mais importante, gostaria de saber como posso pedir ao Apt-Get para honrar as restrições sem ter que replicar manualmente os metadados do pacote nos meus parâmetros do apt-get.

    
por Jason Stangroome 02.10.2014 / 23:21

1 resposta

3

O que você está enfrentando é o problema de apt / apt-get não ser tão inteligente quanto você pensa que é.

Esse problema ocorre ao tentar fazer o downgrade do (s) seu (s) pacote (s) ou instalar uma versão mais antiga do que a versão que os repositórios têm como candidata mais recente (com relação à fixação de apt priority e outras políticas relacionadas a prioridades do repositório). Quando você faz o downgrade do seu pacote, você tem que especificar para cada dependência individual qual versão você está rebaixando, ou neste caso qual versão específica você realmente quer instalar.

No caso dos pacotes nginx , onde nginx-full e nginx-common dependem uns dos outros, você deve explicitamente dizer ao apt para instalar cada um dos pacotes da (s) versão (ões) especificada (s) . Isso ocorre porque 1.7.6-1+trusty1 substitui 1.7.5-1+trusty1 pelo número da versão. Como resultado, você precisa dizer especificamente "Instale somente o pacote desta versão específica" por causa das versões substituídas existentes, ou seja, apt-get install nginx-full=1.7.5-1+trusty1 nginx-common=1.7.5-1+trusty1

Não é relevante para sua pergunta, mas isso também acontece quando você instala a partir de um repositório que tem uma menor prioridade de pinagem apt do que outra versão, caso em que você precisa especificar as versões e / ou fontes ) para instalar manualmente, isto é, sudo apt-get install nginx-full/trusty-proposed nginx-common/trusty-proposed sendo um excelente exemplo de tentar instalar um pacote e dependências do repositório proposto, que possui uma apt de prioridade muito menor que os PPAs ou os repositórios principais.

    
por Thomas Ward 02.10.2014 / 23:34