'dpkg-query' e pacotes virtuais: como ler ou interpretar '$ {Fornece}'?

1

Antecedentes

Durante minha auditoria periódica de pacotes instalados, encontrei um erro. Para essa auditoria, um aplicativo gera um gráfico de pacotes instalados usando dpkg-query . Durante esse processo, ele verifica no momento, todas as dependências são realmente satisfeitas, pois isso poderia significar que algo está errado no sistema ou algo está errado com o aplicativo que gera o gráfico. Aconteceu hoje que o aplicativo parou em um erro, dizendo que encontrou um pacote com uma dependência insatisfeita para python:any . No entanto, o pacote dependente está bem. Eu verifiquei python:any é um pacote virtual fornecido pelo pacote python . O Synaptic diz que python fornece python:any , mas meu aplicativo não recebe essa informação de dpkg-query .

Aqui está um teste que você pode executar a partir da linha de comando, que mostra o problema (assumindo o Ubuntu 14.04):

$ dpkg-query --showformat='${Package}\n${Provides}\n' --show python3
> python3
> python3-profiler
# Note 'python3:any' does not appear

Sobre o mesmo pacote, o Synaptic diz que fornece python3:any e python3-profiler . O primeiro está faltando nas informações retornadas por dpkg-query .

Ao aparecer como uma dependência, tudo bem:

$ dpkg-query --showformat='${Package}\n${Depends}\n' --show apturl-common
# Note the second item in the format is now 'Depends'
> apturl-common
> python3:any (>= 3.3.2-2~), python3-apt, python3-update-manager

Pergunta

Isso é um bug em dpkg-query ? Ou será que estou erroneamente esperando que ele conte sobre todos os pacotes virtuais, enquanto posso inferir que esse tipo de pacote virtual é "eu mesmo"? São algumas regras que eu não sei sobre o que é retornado em ${Provides} ?

    
por Hibou57 24.04.2015 / 13:26

2 respostas

2

python3:any (>= 3.3.2-2~) não é um pacote virtual, é uma cadeia de substituição criada pelo padrão ${python3:Depends} e preenchida por dh_python3 quando chamada de dh_gencontrol quando o pacote foi criado. Dê uma olhada no arquivo debian/control do pacote apturl source:

Package: apturl-common
Architecture: any
Depends: ${python3:Depends},
 ${shlibs:Depends},
 ${misc:Depends},
 python3-apt,
 python3-update-manager
Replaces: apturl (<< 0.3.6ubuntu2)
Description: install packages using the apt protocol - common data
 AptUrl is a simple graphical application that takes an URL (which follows the
 apt-protocol) as a command line option, parses it and carries out the
 operations that the URL describes (that is, it asks the user if he wants the
 indicated packages to be installed and if the answer is positive does so for
 him).

Agora, por que python3:any ? Vamos citar a política do debian:

  

Especificar apenas qualquer um indica que o pacote de origem não é dependente   em qualquer arquitetura particular e deve compilar bem em qualquer um. o   pacote (s) binário (s) produzido (s) será específico para qualquer que seja o   construir arquitetura é.

E este é exatamente o caso do pacote binário python3 :

Package: python3
Architecture: any
Multi-Arch: allowed
Pre-Depends: python3-minimal (= ${binary:Version})
Depends: python3.4 (>= 3.4.3-1), libpython3-stdlib (= ${binary:Version}), ${misc:Depends}, dh-python
Suggests: python3-doc (>= ${binary:Version}), python3-tk (>= 3.4.3-1) , python3-venv (>= ${binary:Version})
Replaces: python3-minimal (<< 3.1.2-2)
Provides: python3-profiler
Description: interactive high-level object-oriented language (default python3 version)
 Python, the high-level, interactive object oriented language,
 includes an extensive class library with lots of goodies for
 network programming, system administration, sounds and graphics.
 .
 This package is a dependency package, which depends on Debian's default
 Python 3 version (currently v3.4).

Fontes:

por Sylvain Pineau 24.04.2015 / 15:25
0

Sinto que posso adivinhar uma resposta, ainda sinto-me à vontade para adicionar a sua própria resposta.

Eu aprendi que existe um banco de dados /var/lib/dpkg/available , como texto bruto. Eu verifiquei por python3 (para continuar com o mesmo exemplo da pergunta) ele diz Provides: python3-profiler : não há python3:any .

Assim pode ser a resposta: nem sempre há uma correspondência direta entre os requisitos retornados por dpkg-query e um pacote fornecido como retornado por dpkg-query , e provavelmente o Synaptic infere um pacote virtual "falso" e python3:any não é realmente um pacote virtual (eu diria que o Synaptic é enganoso aqui).

Provavelmente não há nada com os pacotes fornecidos, e sou eu que está lendo erroneamente :xyz no final de um pacote de dependências como parte do nome do pacote, enquanto não é.

    
por Hibou57 24.04.2015 / 15:26