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

6

Eu sou absolutamente novo na embalagem, então me perdoe se eu estiver perguntando algo óbvio para um empacotador experiente ...

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

Digamos que meu aplicativo use lib library-xyz , que não é instalado por padrão. Se eu construir o pacote e instalá-lo em minha máquina de desenvolvimento, o library-xyz já 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-xyz instalado e o programa provavelmente falhará por ele.

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

Estou empacotando programas python.

    
por mac 19.08.2011 / 02:59

2 respostas

3

O programa lintian é executado após a criação de um pacote usando debuild e deve avisá-lo sobre bibliotecas ausentes ao construir um pacote binário. O comando ldd pode ser usado para verificar quais bibliotecas são necessárias para um pacote.

Eu uso o script abaixo para buscar rapidamente dependências de pacotes de bibliotecas:

#!/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, já que testa cada arquivo separadamente. Ele pode ser otimizado para gerar uma lista de bibliotecas primeiro e depois passar as entradas exclusivas para o comando dpkg -S , 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
    
por Lekensteyn 19.08.2011 / 12:01
1

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

Outra solução semelhante (executar testes em um ambiente restrito), se você está apenas considerando dependências contra bibliotecas python, seria criar um virtualenv para que você esteja no controle das bibliotecas python disponíveis durante o teste. Uma ferramenta que seria útil para gerenciar os ambientes virtuais usando várias versões do Python durante a execução dos testes seria tox .

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

    
por jcollado 11.11.2011 / 16:18