如何在不安装软件包的情况下安装 deb 依赖项?

How to install deb dependencies without installing the package?

我有一个带有 debian/control 文件的 Debianized 项目。我知道如何使用 devscripts 包中的 mk-build-deps 脚本来安装该项目的构建依赖项;即紧跟在 Build-Depends:.

之后的包裹

我需要的是一种与 runtime 依赖项类似的方法;即紧跟在 Depends: 键之后的包。本质上我需要 mk-run-deps 除了 mk-build-deps.

这是我一起破解的东西,可以正常工作:

export TMP_DEBIAN_CONTROL=$(mktemp)
dpkg-gencontrol \
    -O${TMP_DEBIAN_CONTROL} \
    -P$(mktemp -d) \
    -c"$(pwd)/debian/control" \
    -f$(mktemp) \
    -p'project-name'
sed -ri 's|^Package: |Source: |;s|^Depends: |Build-Depends: |' \
    ${TMP_DEBIAN_CONTROL}
mk-build-deps -irt'apt-get -y' ${TMP_DEBIAN_CONTROL}

有更好的方法吗?

简短的回答是,除了实际构建二进制包并从 .debs 中提取它们之外,没有合适的通用方法来获取依赖项。

那是因为在构建时,辅助工具甚至 debian/rules 通过 substvars 都会生成依赖项,这可能取决于动态检查,例如 OS 供应商、架构等

如果您控制源代码包并知道假设是什么,那么您提供的代码片段可能会起作用,但如果您正在使用 debhelper,它可能仍然会错过注入的依赖项。

我想真正的问题是你为什么需要这个?出于测试目的,您最好使用 autopkgtests,它能够通过参考源包 build-dependencies 或被测试的特定二进制包的 运行-time 依赖性来声明依赖性。如果需要将其作为构建过程的一部分,则应将其列在源包构建依赖项中。

对于 运行-time 依赖项,您可能还缺少 Pre-Depends,尽管这些并不常见。对于构建依赖项,您可以使用 apt build-dep .,但存在无法通过元数据包跟踪它们的问题,然后可以删除元数据包以删除所有不需要的依赖项。

运行时依赖项:请 运行 $ dpkg-shlibdeps -t <executable> 与可执行文件和库一起获得“Depends=”列表。

“dpkg-shlibdeps -t”所需的设置:

dpkg-shlibdeps-test/     ## random example folder
    ├── debian/
    │   ├── control         ## empty text file
    │   └── substvars       ## text file: created by $ command
    └── gcc-11              ## example executable

依赖项被写入文件substvars。这个例子,gcc,写道:shlibs:Depends=libc6 (>= 2.31)

您可以为 package.deb 添加到 controlDepends: libc6 (>= 2.31)


关于 debhelper:dh_makeshlibs 是一个 debhelper 程序,它自动扫描共享库,并为它找到的库生成一个 shlibs 文件。 man dh_makeshlibs https://manpages.debian.org/testing/debhelper/dh_makeshlibs.1.en.html 参考。 Google , debhelper 如何做 shlibs