Defina opções do apt-get para tolerar o kludge inofensivo 'dpkg --force-conflicts'?

7

Um pacote foo trivialmente conflitante pode ser feito para trabalhar com barra , executando dpkg --force-conflicts -i foo . Mas eventualmente é hora de atualizar e objetos 'apt-get':

% apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
 foo : Conflicts: bar but 0.2-1 is installed
E: Unmet dependencies. Try using -f.

O apt-get pode ser ajustado / forçado a tolerar o conflito (praticamente corrigido), então atualizar?

(Prova de existência rápida: desinstale foo , depois atualize, depois reinstale foo como antes. Portanto é possível, a questão é encontrar o mecanismo menos pesado.)

Um exemplo, mas essa questão não é sobre quaisquer dois pacotes específicos .

Por vários anos, o GNU paralelo teve um conflito trivial com moretutils ; cada um fornece / usr / bin / parallel . dpkg pode forçar a coexistência:

# assume 'moreutils' is already installed, and 'parallel' is in
# apt's cache directory.
dpkg --force-conflicts -i /var/cache/apt/archives/parallel_20141022+ds1-1_all.deb

Isso cria um desvio, renomeia a versão moreutils para /usr/bin/parallel.moreutils . Ambos os programas funcionam, até que o usuário atualize.

Eu tentei uma opção -o , mas isso não trouxe paz:

apt-get -o Dpkg::Options::="--force-conflicts" install parallel moreutils

Possível número de opções -o na casa das centenas, no entanto ...

    
por agc 05.05.2016 / 18:28

2 respostas

6

Como o OP pediu uma lista de comandos (com os quais alterar os metadados relevantes do pacote) nos comentários para a resposta de Gilles, aqui está:

# download .deb
apt download parallel
# alternatively: aptitude download parallel

# unpack
dpkg-deb -R parallel_*.deb tmp/

# make changes to the package metadata
sed -i \
  -e '/^Version:/s/$/~nomoreutconfl/' \
  -e '/^Conflicts: moreutils/d' \
  tmp/DEBIAN/control

# pack anew
dpkg-deb -b tmp parallel_custom.deb

# install
dpkg -i parallel_custom.deb

Isto está sob as suposições de que a linha de conflitos tem apenas moreutils como uma entrada (e sem restrições de versão), como foi o caso na minha instalação. Caso contrário, use '/^Conflicts:/s/\(, \)\?moreutils\( [^,]\+\)\?//' como o segundo script sed para remover apenas a parte relevante da linha e suportar restrições de versão.

Seu pacote instalado não será sobrescrito por versões mais novas do repositório e você terá que repetir manualmente este procedimento para cada atualização do pacote paralelo GNU se quiser manter este pacote atualizado.

    
por 30.10.2016 / 07:06
3

Um conflito entre pacotes é prejudicial por si só. Quando você força dpkg a instalar os pacotes conflitantes, isso pode não causar nenhum dano outro se o conflito foi declarado sem um bom motivo, mas os pacotes ainda estão em conflito. O APT trabalha duro para resolver conflitos ao instalar pacotes e não tem uma lista de conflitos para ignorar. Você não pode resolver isso fazendo com que ele passe diferentes opções para dpkg : o problema é que os conflitos tornam o trabalho do APT impossível.

Nunca instale pacotes conflitantes, a menos que seja um estado temporário para sair de uma situação em que o APT seja interrompido. Não execute o APT até trabalhar com dpkg para sair da situação conflitante.

Se você deseja instalar pacotes conflitantes, modifique-os primeiro para remover a declaração Conflict: , além de resolver os problemas que motivaram a declaração de conflitos.

    
por 06.05.2016 / 02:47