为什么apt-get安装比指定程序包支持的依赖项新的依赖项

杰森·斯坦格鲁姆(Jason Stangroome)

我遇到了一个问题,即某个特定版本的程序包需要另一个特定版本的程序包,但是Apt-Get选择依赖项的新版本,然后失败。

我在Puppet Lab的MCollective和Nginx Mainline PPA以及可能的其他软件包中都遇到过这种情况,所以我的问题是解决Apt-Get依赖关系的一般方法,但我将以Nginx为例。

我有一个软件包镜像(使用Aptly构建),其中包含nginx-full软件包的v1.7.5及其所有依赖关系,以及较新的v1.7.6软件包及其所有依赖关系。

如果执行,apt-get install nginx-full=1.7.5-1+trusty1则安装失败,并显示以下消息:

The following packages have unmet dependencies:
 nginx-full : Depends: nginx-common (= 1.7.5-1+trusty1) but 1.7.6-1+trusty1 is to be installed

但是,如果执行,apt-get install nginx-full=1.7.5-1+trusty1 nginx-common=1.7.5-1+trusty1则安装成功。

当我在镜像上同时拥有nginx-common软件包的1.7.5和1.7.6版本并且nginx-full软件包明确声明它需要1.7.5的nginx-common软件包时,nginx-full是我所要求的软件包,为什么apt-get仍然选择nginx-common不兼容的1.7.6版本?

这是dpkg -s nginx-full安装1.7.5之后的输出,显示了确切的版本依赖关系约束:

Version: 1.7.5-1+trusty1
Depends: nginx-common (= 1.7.5-1+trusty1), libc6 (>= 2.14), ...

在这种情况下,所需的确切版本链很短,因此解决方法很容易,但对我来说至少有两个问题:

  1. 其他软件包具有更长的依赖项链,这些链条很难发现,然后附加到apt-get命令行中。
  2. 在将较新版本的依赖项发布到程序包镜像之前,很容易不知道即将发生的问题。

我无法理解的是,为什么依赖项解析显然忽略了指定软件包的确切版本约束。更重要的是,我想知道如何可以要求Apt-Get遵守约束,而不必将包元数据手动复制到我的apt-get参数上。

托马斯·沃德

您正在遇到的问题是apt/apt-get不如您想像的那么聪明。

尝试降级软件包或安装比存储库作为最新候选版本的软件包更旧的软件包版本时,会发生此问题(关于apt优先级固定和其他有关存储库优先级的策略)。降级软件包时,实际上必须为每个依赖项指定要降级到的版本,或者在这种情况下,实际上是要安装的特定版本。

如果是nginx软件包,nginx-full并且nginx-common彼此依赖,则必须明确告诉apt安装指定版本的每个软件包这是因为由版本号1.7.6-1+trusty1代替1.7.5-1+trusty1结果,由于存在被取代的版本,因此您必须专门说“仅安装该特定版本的软件包”,即apt-get install nginx-full=1.7.5-1+trusty1 nginx-common=1.7.5-1+trusty1

不相关的问题,但是当你从具有较低的存储库安装这也恰好apt比其他版本的钉扎优先级,在这种情况下,你必须指定版本和/或源极(S)从手动安装,即sudo apt-get install nginx-full/trusty-proposed nginx-common/trusty-proposed是一个尝试从建议的存储库安装软件包和依赖项的主要示例,该存储库和依赖项的apt优先级比PPA或主存储库的优先级得多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么NuGetPack响应“无法创建没有依赖项或内容的程序包”

为什么 Ubuntu 列出的 Python 依赖项与 apt-get 安装的不同

`apt-get install`是否安装依赖项的依赖项?

配置APT还可以缓存程序包的所有依赖项?

为什么R找不到与主程序包相同的本地文件夹中的依赖项?

指定旧版本时,为什么apt-get install依赖项解析不起作用?

查找为什么安装间接依赖项

cpanm为什么不安装依赖项?

14.04可信任:“ apt-get install”静默地拒绝具有不满意依赖项的升级程序包

使用apt-get删除软件包和已安装的依赖项

不能通过“ apt-get autoremove”删除作为依赖项安装的软件包

当将虚拟软件包指定为依赖项时,apt / dpkg如何选择安装哪个实际软件包?

apt-get:未满足的依赖项,但是依赖项无法安装

Dpkg和apt-get是否安装依赖项?

撤消具有许多依赖项的apt-get安装

Apt-Get依赖项将不会安装

导致apt-get无法安装gcc / g ++的依赖项

为什么我不能安装带有固定依赖项的包?

为什么要在忽略依赖项的情况下安装软件包?

为什么删除“元软件包”不删除它安装的依赖项?

为什么不pip安装setup.py中指定的依赖项?

强制apt / yum不安装依赖项

为什么包的构建依赖项不完整?

使用'rpm -i'在CentOS6上安装软件包,但是得到依赖项错误,即使我已经安装了依赖项,为什么?

为什么在创建 React Native 应用程序时安装的 cocoapods 依赖项失败?

为什么Stack无法识别它刚刚安装的依赖项?

如何查看为什么在npm中安装了依赖项?

如何获得用户而不是依赖项使用apt-get安装了哪些软件包的列表?

为什么apt-get需要sudo?