【问题标题】:How to install deb dependencies without installing the package?如何在不安装包的情况下安装 deb 依赖项?
【发布时间】:2018-06-03 10:03:38
【问题描述】:

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

我需要的是一种与 runtime 依赖项类似的方法;即紧跟在Depends: 键之后的包。基本上,除了mk-build-deps 之外,我还需要一个mk-run-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}

有没有更好的方法来做到这一点?

【问题讨论】:

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

标签: dependencies debian packaging dpkg


【解决方案1】:

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

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

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

我想真正的问题是你为什么需要这个?出于测试目的,您最好使用 autopkgtests,它能够通过引用源包构建依赖项或正在测试的特定二进制包的运行时依赖项来声明依赖项。如果在构建过程中需要这样做,那么应该在源包构建依赖项中列出这些内容。

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

【讨论】:

  • > 你为什么需要这个?在我写这个问题的时候,我的任务是创建“图像”来封装给定包的依赖项——一个用于构建依赖项,另一个用于运行依赖项。我现在意识到这个任务不适合正常的 Debian 打包工作流程。
【解决方案2】:

运行时依赖项:请使用可执行文件和库运行 $ 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 添加到 control:Depends: libc6 (>= 2.31)


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

【讨论】:

  • 这个答案展示了如何通过dpkg-shlibdeps扩展运行时依赖。我赞成它,因为命令完成了我想要的(至少是一个子集)。我没有将其标记为解决方案的一个原因是:它似乎没有任何 debhelper 等效项。
猜你喜欢
  • 2015-06-28
  • 1970-01-01
  • 2014-05-19
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多