apt-get não resolve corretamente uma dependência em uma versão fixa em um pacote Debian / Ubuntu

5

Eu tenho um pacote personalizado foo com uma dependência no arquivo de controle em uma versão fixa de outro pacote bar :

Depends: bar (= 1.2.3)

Os pacotes foo e bar são publicados no meu próprio repositório. Além disso, tenho várias versões de bar no repo, digamos, 1.2.3 e 2.1.0. Agora, ao tentar instalar foo em uma nova máquina usando

apt-get install foo

falha com

The following packages have unmet dependencies:
 foo : Depends: bar (= 1.2.3) but 2.1.0 is to be installed

Ou seja. O apt-get não parece descobrir corretamente as versões apropriadas dos pacotes a serem usados.

Eu tentei adicionar conflitos:

Depends: bar (= 1.2.3)
Conflicts: bar (>> 1.2.3)

mas isso só resultou na mudança do erro para

The following packages have unmet dependencies:
 foo : Depends: bar (= 1.2.3) but it is not going to be installed

Se eu especificar a versão da barra durante a instalação, isso funciona:

apt-get install foo bar=1.2.3

Mas isso não é viável (o caso real tem vários níveis de dependências e eu realmente não quero ter que implementar meu próprio resolvedor de dependências para encontrar e especificar tudo manualmente na linha de comando - pode muito bem ignorar apt nesse caso).

Portanto, a questão é, existe alguma maneira de se comportar adequadamente e instalar automaticamente as versões corretas das dependências (sem ter que especificar explicitamente essas versões na linha de comando)? E devo acrescentar que eu também não quero ter que ir na rota do apt_preferences com o pinning da versão, já que isso requer o gerenciamento de versões em dois lugares separados.

Para fins de integralidade, aqui está a saída completa ao ativar várias saídas de depuração do apt:

apt-get -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::AutoInstall=1 -o Debug::pkgDepCache::Marker=1 install foo

Reading package lists... Done
Building dependency tree       
Reading state information... Done
  foo:amd64 Depends on bar [ amd64 ] < none -> 2.1.0 > ( universe/utils ) (= 1.2.3) can't be satisfied!
Starting pkgProblemResolver with broken count: 1
Starting 2 pkgProblemResolver with broken count: 1
Investigating (0) foo [ amd64 ] < none -> 1.0.0 > ( misc )
Broken foo:amd64 Depends on bar [ amd64 ] < none -> 2.1.0 > ( universe/utils ) (= 1.2.3)
  Considering bar:amd64 0 as a solution to foo:amd64 9998
  Re-Instated bar:amd64
Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 foo : Depends: bar (= 1.2.3) but 2.1.0 is to be installed
E: Unable to correct problems, you have held broken packages.
    
por roadrunner 09.03.2017 / 09:51

1 resposta

2

O resolvedor do apt não considera a possibilidade de você querer instalar algo que não seja a versão mais recente disponível de um pacote em uma determinada release de destino; O Debian simplesmente não suporta a instalação de qualquer coisa, mas a versão mais atualizada de um pacote para o seu sistema.

Se você estiver usando repositórios diferentes para cada versão de um (conjunto de) pacote (s), então você pode usar o pinning para preferir uma origem, ou dar a eles um codinome diferente e usar a opção -t do apt para selecionar o liberação alvo. Caso contrário, simplesmente não é possível.

    
por 09.03.2017 / 10:06