我遇到了一个问题,即某个特定版本的程序包需要另一个特定版本的程序包,但是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), ...
在这种情况下,所需的确切版本链很短,因此解决方法很容易,但对我来说至少有两个问题:
我无法理解的是,为什么依赖项解析显然忽略了指定软件包的确切版本约束。更重要的是,我想知道如何可以要求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] 删除。
我来说两句