Soy absolutamente nuevo en el mundo del embalaje, así que perdónenme si le pido algo obvio a un empaquetador experimentado...
¿Cómo puedo estar seguro de que se mencionaron todas las dependencias correctamente en mi paquete?
Digamos que mi aplicación utiliza lib library-xyz
que no está instalado de forma predeterminada. Si compilo el paquete y lo instalo en mi máquina de desarrollo, library-xyz
ya estará instalado, por lo que, incluso si no lo menciono como una dependencia, el programa seguirá ejecutándose correctamente. Pero otro usuario con una instalación nueva de ubuntu no lo habrá library-xyz
instalado y es probable que el programa falle.
La forma en que estoy probando ahora es ejecutando una nueva instalación de Ubuntu en una máquina virtual e instalando el paquete allí, pero como parece un problema común, me pregunto si hay una mejor manera de probar, algo que adopte la misma filosofía de chroot
pero que - en lugar de "cortar" partes del sistema de archivos, "cortaría" todos aquellos paquetes instalados que no son "predeterminados" en una instalación limpia de Ubuntu.
Estoy empaquetando programas de Python.
Respuesta1
El lintian
programa se ejecuta después de crear un paquete usando debuild
y debería advertirle sobre bibliotecas faltantes al crear un paquete binario. El ldd
comando se puede utilizar para comprobar qué bibliotecas son necesarias para un paquete.
Utilizo el siguiente script para recuperar rápidamente las dependencias de los paquetes de la 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
El comando puede tardar un poco en directorios grandes, ya que prueba cada archivo por separado. Se puede optimizar para generar primero una lista de bibliotecas y luego pasar las entradas únicas al dpkg -S
comando, pero eso es un ejercicio para el lector.
Ejemplo: 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
Respuesta2
Como se explica en mi comentario anterior sobre pbuilder, es útil principalmente para verificar las dependencias de compilación (similar a cargar el paquete en un PPA de plataforma de lanzamiento), pero no será útil para verificar las dependencias a menos que agregue algunos pasos adicionales en sus scripts de empaquetado, como ejecutar la unidad. pruebas.
Otra solución similar (ejecutar pruebas en un entorno restringido), si solo está considerando dependencias con bibliotecas de Python, sería crear unaentorno virtualpara que tengas el control de las bibliotecas de Python disponibles durante las pruebas. Una herramienta que sería útil para administrar los entornos virtuales utilizando múltiples versiones de Python mientras se ejecutan las pruebas seríatoxicidad.
Esto no agregará las dependencias en el debian/control
archivo, pero podría ser útil de todos modos.