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-xyz
que não está instalado por padrão. Se eu construir o pacote e instalá-lo em minha máquina de desenvolvimento, ele 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 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 chroot
que - 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 lintian
programa é executado após a construção de um pacote usando debuild
e deve avisá-lo sobre bibliotecas ausentes ao construir um pacote binário. O ldd
comando 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 -S
comando, 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/control
arquivo, mas poderá ser útil de qualquer maneira.