如何在不安装软件包的情况下安装 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 添加到 control
:Depends: 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
我有一个带有 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 添加到 control
:Depends: 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