我对包装完全陌生,所以如果我问了一个对于经验丰富的包装工来说显而易见的问题,请原谅我……
我如何确保我的包中正确提到了所有的依赖项?
假设我的应用程序使用library-xyz
默认未安装的 lib。如果我构建包并将其安装在我的开发机器上,library-xyz
它将已经安装,因此 - 即使我没有将其作为依赖项提及 - 程序仍将正确运行。但是新安装的 ubuntu 上的另一个用户不会library-xyz
安装,程序可能会崩溃。
我现在测试的方式是在虚拟机中运行全新的 ubuntu 安装并在那里安装软件包,但由于这似乎是一个常见问题,我想知道是否有更好的测试方法,采用相同的理念但那chroot
- 不是“剪切出”文件系统的部分,而是“剪切出”干净的 ubuntu 安装中所有不是“默认”的已安装软件包。
我正在打包 python 程序。
答案1
该lintian
程序在使用构建包后运行debuild
,并在构建二进制包时警告您缺少库。该ldd
命令可用于检查包需要哪些库。
我使用以下脚本来快速获取库包依赖项:
#!/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
对于大型目录,该命令可能需要一段时间,因为它会单独测试每个文件。可以对其进行优化,先生成库列表,然后将唯一条目传递给命令dpkg -S
,但这是读者的练习。
例子: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