Existe uma maneira de testar os pacotes que eu construo para dependências corretas?

Existe uma maneira de testar os pacotes que eu construo para dependências corretas?

Sou absolutamente novo em embalagens, então me perdoe se estou perguntando algo óbvio para um empacotador experiente...

Como posso ter certeza de que mencionei todas as dependências corretamente no meu pacote?

Digamos que meu aplicativo faça uso de lib library-xyzque não está instalado por padrão. Se eu construir o pacote e instalá-lo em minha máquina de desenvolvimento, ele library-xyzjá estará instalado, então - mesmo que eu não tenha mencionado isso como uma dependência - o programa ainda será executado corretamente. Mas outro usuário em uma nova instalação do Ubuntu não terá library-xyzinstalado e o programa provavelmente travará para ele.

A forma como estou testando agora é ter uma nova instalação do Ubuntu rodando em uma VM e instalar o pacote lá, mas como parece um problema comum, me pergunto se existe uma maneira melhor de testar, algo que adote a mesma filosofia, mas chrootque - em vez de "cortar" partes do sistema de arquivos, "cortar" todos os pacotes instalados que não são "padrão" em uma instalação limpa do Ubuntu.

Estou empacotando programas python.

Responder1

O lintianprograma é executado após a construção de um pacote usando debuilde deve avisá-lo sobre bibliotecas ausentes ao construir um pacote binário. O lddcomando pode ser usado para verificar quais bibliotecas são necessárias para um pacote.

Eu uso o script abaixo para buscar rapidamente as dependências do pacote da biblioteca:

#!/bin/sh
# Save it as executable ~/bin/pkglibs
# Usage: pkglibs directory
#        pkglibs file
list_lib_pkgnames() {
    local lib="$1" libs
    # get the libraries for given "$lib", stripping out linker libraries
    libs=$(ldd "$lib" | awk '/=/{print $1}' | grep -vE '^(linux-vdso|linux-gate)\.so\.1$')
    # if there are libraries, find the matching packages for it
    [ -n "$libs" ] && dpkg -S $libs | sed 's/: .*//'
}
search="$1"
if [ -d "$search" ]; then
    # for directories, recursively search for library dependencies
    find "$search" -type f -exec "$0" {} \; | sort -u
else
    list_lib_pkgnames "$search"
fi

O comando pode demorar um pouco para diretórios grandes, pois testa cada arquivo separadamente. Ele pode ser otimizado para gerar primeiro uma lista de bibliotecas e depois passar as entradas exclusivas para o dpkg -Scomando, mas isso é um exercício para o leitor.

Exemplo: pkglibs /usr/lib/mesa/:

ia32-libs
lib32gcc1
lib32stdc++6
libc6
libc6-i386
libdrm2
libgcc1
libstdc++6
libx11-6
libxau6
libxcb1
libxdamage1
libxdmcp6
libxext6
libxfixes3
libxxf86vm1

Responder2

Conforme explicado no meu comentário acima sobre o pbuilder, é útil principalmente para verificar dependências de construção (semelhante ao upload do pacote para um PPA da barra de lançamento), mas não será útil para verificar dependências, a menos que você adicione algumas etapas adicionais em seus scripts de empacotamento, como executar a unidade testes.

Outra solução semelhante (executar testes em um ambiente restrito), se você estiver apenas considerando dependências de bibliotecas python, seria criar umvirtualenvpara que você tenha controle das bibliotecas python disponíveis durante os testes. Uma ferramenta que seria útil para gerenciar os ambientes virtuais usando múltiplas versões do python durante a execução dos testes seriatóxico.

Isso não adicionará as dependências para você no debian/controlarquivo, mas poderá ser útil de qualquer maneira.

informação relacionada