我正在尝试构建一个在 Fedora 和 openSUSE 下工作的跨发行版二进制 RPM 包。我正在使用Require:标签来设置依赖包名称。问题是每个 GNU/Linux 发行版存储库中的包名称都不同。
阅读:http : //goo.gl/3MXSq,并使用 '%if 0%{?suse_version} ' 语句给出一个跨发行版的 .spec 文件。也就是说,deps 列表将在构建时确定,而不是在安装时确定。
有没有办法在二进制 RPM 包中设置 deps 的条件列表?
我正在尝试使用本手册安装 Skype 。我使用以下命令成功下载了软件包:
wget -O skype-install.deb http://www.skype.com/go/getskype-linux-deb-64
Run Code Online (Sandbox Code Playgroud)
但是当我尝试安装软件包时,我收到了一些关于依赖项的错误:
root@102:~# dpkg -i skype-install.deb
(Reading database ... 27918 files and directories currently installed.)
Preparing to replace skype 4.0.0.8-1 (using skype-install.deb) ...
Unpacking replacement skype ...
dpkg: dependency problems prevent configuration of skype:
skype depends on lib32stdc++6 (>= 4.1.1-21); however:
Package lib32stdc++6 is not installed.
skype depends on lib32asound2 (>> 1.0.14); however:
Package lib32asound2 is not installed.
skype depends on ia32-libs; however:
Package ia32-libs is not installed.
skype depends on libc6-i386 …Run Code Online (Sandbox Code Playgroud) 我对软件依赖的理解是,一个程序包可能需要安装其他包,称为依赖。一个树状的结果随之而来。有时包共享公共依赖项,但包只需要安装一次。
|套餐D
| 套餐B--------->|
| |套餐E
套餐A ------->|
| |套餐F
| 套餐C--------->|
|套餐B
我最近在 AskUbuntu.com 上发布了一个关于查找包依赖项的问题,所有这样做的方法都给了我不同的结果。这样做的原因是,有些方法显然不仅列出了依赖项,有些还执行递归检查,有些执行反向检查。
反向依赖检查和递归依赖检查有什么区别?
编辑:
术语的引用。我第一次听到它们是在我发布的关于 APT 的线程的评论中,但它们被用于几个可用于执行依赖项检查的程序以及它们的联机帮助页。
apt-cache rdepends 正在寻找反向依赖项,我的脚本和 apt-rdepends 正在递归地寻找依赖项。
rdepends pkg(s)
rdepends 显示包具有的每个反向依赖项的列表。
apt-rdepends - 执行类似于
缓存
我正在编写 chroot 监狱的创建脚本,该自动化的一部分包括将各种可执行文件及其依赖项复制到监狱中。我正在使用以下 bash 行来解析依赖项列表中的文件路径(例如,对于 java):
$ ldd `which java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2
Run Code Online (Sandbox Code Playgroud)
这对 Node.js 和 Python 非常有用,但是当我尝试java从监狱中执行时,出现错误:
java:加载共享库时出错:libjli.so:无法打开共享对象文件:没有这样的文件或目录
事实证明,依赖项列表中缺少libjli.so路径……至少那些ldd向我们展示的路径(第 5 行):
$ ldd `which java`
linux-vdso.so.1 => (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)
Run Code Online (Sandbox Code Playgroud)
我找到了文件...
$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so
Run Code Online (Sandbox Code Playgroud)
...但我想知道为什么它没有列出ldd。它显然是一个已知的依赖项,但路径未知?任何帮助表示赞赏!
我想找到某个包的所有可能的反向依赖(不需要递归反向依赖)p,也就是说,我想找到所有依赖于p. 这应包括对p的源包的反向依赖以及反向构建依赖。
如果我理解正确的话,有 4 种类型的反向依赖关系:
r 取决于 pr 取决于源包 pr需要pr需要源包p我想找到所有这些。
对于 Debian,有apt-rdepends -r但手册上说:
apt-rdepends cannot do reverse build-dependencies.
Run Code Online (Sandbox Code Playgroud)
对于 Ubuntu,有reverse-depends,这似乎让我做我想做的事,但它似乎是特定于 Ubuntu 的,正如手册页所述
提供者:ubuntu-dev-tools_0.153_all
是否有类似反向依赖的工具适用于非 Ubuntu 发行版,尤其是那些使用deb和rpm包的发行版?
我有一个自定义包foo,它的控制文件依赖于另一个包的固定版本bar:
Depends: bar (= 1.2.3)
Run Code Online (Sandbox Code Playgroud)
无论是foo和bar包都发表在我自己的回购协议。此外,我bar在 repo 中有多个版本,比如 1.2.3 和 2.1.0。现在,当尝试foo使用
apt-get install foo
Run Code Online (Sandbox Code Playgroud)
它失败了
The following packages have unmet dependencies:
foo : Depends: bar (= 1.2.3) but 2.1.0 is to be installed
Run Code Online (Sandbox Code Playgroud)
即 apt-get 似乎无法正确找出要使用的正确版本的软件包。
我尝试添加一个冲突:
Depends: bar (= 1.2.3)
Conflicts: bar (>> 1.2.3)
Run Code Online (Sandbox Code Playgroud)
但这只会导致错误更改为
The following packages have unmet dependencies:
foo : Depends: bar (= 1.2.3) but it is not going to be installed
Run Code Online (Sandbox Code Playgroud)
如果我在安装时指定 bar …
我正在尝试在没有互联网连接的系统上安装以下工具。
为了获取所有依赖项和包,我登录到有互联网连接的系统并使用yum install -downloadonly <package-name>
我预计这会列出所有软件包,但没有,当我尝试在没有互联网的系统中安装软件包时,我遇到了很多依赖项失败。例如,检查下面我尝试安装 Firefox 的位置
以下是我从“downloadonly”获得的依赖项/包列表
nss-3.28.4-15.el7_4.x86_64.rpm
nss-devel-3.28.4-15.el7_4.x86_64.rpm
nss-sysinit-3.28.4-15.el7_4.x86_64.rpm
nss-tools-3.28.4-15.el7_4.x86_64.rpm
rpm -Uvh nss-3.28.4-15.el7_4.x86_64.rpm
warning: nss-3.28.4-15.el7_4.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
error: Failed dependencies:
libnssutil3.so(NSSUTIL_3.21)(64bit) is needed by nss-3.28.4-15.el7_4.x86_64
libnssutil3.so(NSSUTIL_3.24)(64bit) is needed by nss-3.28.4-15.el7_4.x86_64
nspr >= 4.13.1 is needed by nss-3.28.4-15.el7_4.x86_64
nss-pem(x86-64) is needed by nss-3.28.4-15.el7_4.x86_64
nss-softokn(x86-64) >= 3.28.3-4 is needed by nss-3.28.4-15.el7_4.x86_64
nss-util >= 3.28.4-2 is needed by nss-3.28.4-15.el7_4.x86_64
nss = 3.19.1-18.el7 is needed by (installed) nss-sysinit-3.19.1-18.el7.x86_64 …Run Code Online (Sandbox Code Playgroud) 我的包裹有问题apt,我已经解决了。问题和解决方案在这里讨论:
Aptitude 说我的很多软件包需要删除......?
然而,在讨论这个问题时,我意识到我有一个辅助问题,apt我想找到答案,这就是我发布这个当前问题的原因。
我不小心做了一些事情,导致超过 1,400 个“自动”软件包成为孤立的,它们被列为“不再使用”,并在aptitude. 现在看来,造成这种情况的原因是因为它们最终都依赖于某个被错误删除的基础级包或元包。
如果是这种情况,是否有一个实用程序或过程可以用来将apt包列表作为输入,并为整个包集(作为一个整体)生成依赖关系树?如果是这样,我可能能够识别出我不小心删除的这棵树顶部的软件包,然后我可以重新安装该软件包以解决我的问题。
换句话说,我正在寻找一些过程或实用程序,它会将包列表作为输入并生成与此类似的内容作为输出......
top-package
|--package-000
|-+package-001
| |--package-002
|-+package-003
| |--package-004
| |--package-005
| |-+package-006
| | |--package-007
| |--package-008
|--package-009
... etc. ...
Run Code Online (Sandbox Code Playgroud)
...package-NNN我的输入包列表以及它们恰好是依赖项的任何其他包在哪里,并且top-package是依赖项树的根。如果我的假设是正确的,即我的问题是由于意外删除了高级元包所致,那么top-package将识别该已删除的包。然后我可以重新安装top-package并大概解决我的问题。
需要明确的是,我想重复一下,我已经以不同的方式解决了我的具体问题(请参阅引用的讨论)。我在这里问这个不是为了解决这个特定问题,而是因为我想要某种像上面描述的依赖树列表工具,以帮助诊断和修复可能发生在未来。
非常感谢您提供任何参考或建议。
Debian 软件包libreoffice-core(在 Debian 存储库中被描述为包含“LibreOffice 的依赖于体系结构的核心文件”,并且其本身是libreoffice-writer和 类似软件包的依赖项)具有绝对依赖关系(即,软件包之间的关系是depends,而不是recommends或suggests)libldap-2.4-2(描述为“OpenLDAP(轻量级目录访问协议)服务器和客户端的运行时库”)。
为什么?迄今为止最常见的用例是编辑本地存储的文件(在其运行的同一台计算机上)的文字处理器如何如此依赖于访问远程目录的协议,以至于如果后者不存在,甚至无法对其进行配置?这只是一个依赖性分类错误(即关系实际上应该是recommendsor suggests),还是 libreoffice 实际上需要安装 OpenLDAP 才能运行?
我有一个无头 FreeBSD 服务器,其中某个端口安装了大量与 X11 相关的软件包。我想找出这些端口是什么,以便我可以摆脱不需要的 X 相关软件包。有没有办法解决这个问题?