Por que o apt-get não instala o trabalho de resolução de dependência ao especificar versões antigas?

0

Os seguintes itens costumavam funcionar e agora não funcionam:

apt-get install r-base=3.3.1-1trusty0 r-base-dev=3.3.1-1trusty0 r-recommended=3.3.1-1trusty0 r-base-core=3.3.1-1trusty0
Reading package lists... Done
Building dependency tree       
Reading state information... 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:
 r-recommended : Depends: r-cran-mgcv (>= 1.1.5) but it is not going to be installed
                 Depends: r-cran-nlme (>= 3.1.52) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

Se eu remover as versões (por exemplo, 3.3.1-1trusty0), o apt-get install funcionará sem erros.

Esta resposta observa que ao especificar versões, "você pode precisar fazer alguma resolução de dependência por conta própria". / p>

Por que a resolução de dependência falha quando a versão é especificada? Qual é a explicação provável de porque o apt-get install foi bem-sucedido sem nenhum erro de dependência com este mesmo comando (usando essas versões) há cerca de um mês?

    
por JDiMatteo 17.02.2017 / 19:55

1 resposta

2

Sua versão mais antiga deve satisfazer dois critérios.

1) A versão antiga deve estar em um repositório que o apt pode ver.

2) A versão antiga não deve quebrar outro software no seu sistema.

Suas mensagens de erro, especialmente erros sobre "pacote interrompido", indicam um conflito de versões . Um conflito de versões significa que o pacote antigo viola # 2 e está prestes a quebrar outras partes do seu sistema.

Dependências como foo 1.1 depends upon libfoo(>0.98) são definidas pelo empacotador do software quando elas criam o pacote. Os empacotadores são voluntários - você também pode aprender a fazer isso.

Empacotadores preguiçosos simplesmente usam as dependências atuais que têm à mão. Exemplo: foo 1.1 depends upon libfoo(=1.1) . Essa falta de flexibilidade nas versões de dependência causa muitos problemas para os usuários. Pacotes preguiçosos são encontrados em muitos PPAs e outros softwares não originados do Ubuntu, e são uma das razões pelas quais esses são fontes não suportadas .

Mais empacotadores experientes testarão seus pacotes para obter funcionalidade com a maior variedade de versões de dependência. Exemplo: foo 1.1 depends upon libfoo(>=0.75) . Esses pacotes geralmente são encontrados no Debian e importados para o Ubuntu a cada ciclo de lançamento.

Distros como Debian e Ubuntu são distros 'instantâneos'. Cada lançamento é baseado em um único instantâneo estável. Os instantâneos mais antigos estão em versões mais antigas. Como as versões mudam constantemente, isso geralmente significa que muitos pacotes são compatíveis APENAS com o lançamento para o qual foram feitos.

Se você deseja executar pacotes mais antigos, deve fazê-lo em uma versão mais antiga do Ubuntu (usando uma VM, por exemplo). Você PODE instalar software mais antigo em qualquer sistema que desejar ... mas não usando pacotes.

    
por user535733 17.02.2017 / 20:03