有没有办法测试我构建的包是否有正确的依赖关系?

有没有办法测试我构建的包是否有正确的依赖关系?

我对包装完全陌生,所以如果我问了一个对于经验丰富的包装工来说显而易见的问题,请原谅我……

我如何确保我的包中正确提到了所有的依赖项?

假设我的应用程序使用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

答案2

正如我在上面关于 pbuilder 的评论中所解释的那样,它主要用于验证构建依赖项(类似于将包上传到启动板 PPA),但除非您在打包脚本中添加一些额外的步骤(如运行单元测试),否则它将无法用于检查依赖项。

另一个类似的解决方案(在受限环境中运行测试),如果你只是考虑对 python 库的依赖,那么可以创建一个虚拟环境这样您就可以控制测试期间可用的 Python 库。在运行测试时,使用多个 Python 版本管理虚拟环境的一个有用工具是

这不会在文件中添加依赖项debian/control,但无论如何都会有帮助。

相关内容