Pelo que eu experimentei não o que eu li.
-
No entanto, quando você quebra A, então B está quebrado também, já que A depende disso. Então, a minha pergunta é se o dpkg tem alguma maneira embutida de lidar com essa situação?
Sim, ele tentará reinstalar ou reconfigurar A na próxima execução.
-
Se ele foi interrompido, ele consertará isso e continuará funcionando normalmente.
-
Mas é um problema com scripts de controle, ele falhará de novo e de novo e permanecerá nesse loop. Então, é um bug e o relatório será preenchido nesse pacote e uma correção manual é necessária.
-
-
O status de instalação do B muda dependendo do status de A?
Não, o status permanece como Nenhuma alteração instalada, mas ele também controla a dependência quebrada, pelo menos não no mesmo arquivo
/var/lib/dpkg/status
. -
Se o dpkg não maneja esta situação de maneira inteligente, o apt?
Não, o APT não interfere neste caso.
apt
usadpkg
, dpkg é a ferramenta de nível inferior e é a única ferramenta que realmente instala, constrói, remove pacotes Debian.
Vamos tentar, melhor é feito em uma caixa virtual.
-
Prepare pacotes fictícios
~$ sudo apt install equivs ~$ mkdir deleteme ~$ cd deleteme
B 1.0.0 depende de A
~/deleteme$ equivs-control b0 ~/deleteme$ nano b0 ... Package: b Version: 1.0.0 ... Depends: a ... ~/deleteme$ equivs-build b0
A 1.0.0 clean install & amp; remover
~/deleteme$ equivs-control a0 ~/deleteme$ nano a0 ... Package: a Version: 1.0.0 ... ~/deleteme$ equivs-build a0
Uma instalação suja 1.0.1, mas remova limpo
~/deleteme$ cp a0 a1 ~/deleteme$ nano a1 ... Package: a Version: 1.0.1 ... Postinst: a1.postinst ... ~/deleteme$ nano a1.postinst #!/bin/sh exit 1 ~/deleteme$ equivs-build a1
Agora, você deve ter:
~/deleteme$ ls -1 a0 a1 a_1.0.0_all.deb a_1.0.1_all.deb a1.postinst b0 b_1.0.0_all.deb
-
Tente este cenário
sudo su dpkg -i b_1.0.0_all.deb dpkg --audit dpkg -i a_1.0.0_all.deb dpkg --audit dpkg --configure -a dpkg --audit dpkg --remove a dpkg --remove b dpkg --remove a dpkg -i a_1.0.0_all.deb dpkg -i b_1.0.0_all.deb dpkg --audit dpkg -i a_1.0.1_all.deb dpkg --audit dpkg --remove a apt purge a
-
Para entrar em um loop onde você não pode concluir a instalação, nem o remova.
Crie clean A 1.0.1, B 1.0.0 mas A 1.0.0 com um script
Prerm:
que contenhaexit 1
. Portanto, quando você tentar instalar o A 1.0.1, o dpkg não conseguirá remover o A 1.0.0.