Gentoo Software Package Conflict


Gentoo 教程目录

Gentoo 软件包冲突

本文介绍 gentoo 系统下的软件包冲突及其解决思路。

软件包冲突

什么是软件包冲突?用一句话来概括就是两者无法共存。无法共存的原因是什么?两者在同一个依赖上有不同的要求。

举个例子。dev-libs/protobufmedia-libs/opencv的一个依赖。它同时也是media-video/vlc的一个依赖。假设现在 vlc 想升级,需要3.19.1版本的 protobuf。但是当前版本的 opencv 要求 protobuf 的版本不得高于3.17.3。于是,由于 opencv 限制了 protobuf 的版本,导致 vlc 无法升级。 冲突就这样产生了。

同理这样的冲突也可能是因为对依赖的 USE FLAGPYTHON_TARGET 等要求不同引起的。

解决思路

对于一般人来说,要去搞清楚 opencv 为什么要求 protobuf 版本不高于3.17.3,并且把它改了,是不太现实的。这基本上都会涉及源码。所以,解决问题的思路只有一个,使用 gentoo 包管理系统提供的操作让冲突双方对依赖的要求相同。

还是上面的例子,当前版本的 opencv 要求 protobuf 版本低,无非是还没有适配高版本 protobuf 的部分特性。那么思路就来了。高版本的 opencv 对 protobuf 的版本要求肯定会提高。如果能找到一个版本的 opencv,其要求的 protobuf 版本包含3.19.1,问题就解决了。另外的像USE FLAGPYTHON_TARGET造成的问题也是一样的。

我们在 gentoo 包管理系统提供的操作上能进行的只有修改软件的版本。所以不管是什么冲突,方法就一条。

要修改版本,自然需要清楚各版本软件的信息。这一点通常可以通过eixequery来实现。

比如equery -g media-libs/opencv查看各版本 opencv 的依赖,发现目前没有一个版本可以满足3.19.1的 protobuf。那么,一般人能做的就到此为止了,耐心等待上游更新软件版本即可。那假设有这么一个版本,又该怎么做呢?

首先,把冲突的各方拎出来。现在有三个dev-libs/protobufmedia-libs/opencvmedia-video/vlc。思考谁会发生版本变化。现在是全都需要。直接emerge 三个包基本上可以解决问题,甚至不需要拆除旧版本。但 emerge 自动处理软件版本的能力是有限的。有时候,比如,从 python3.7 全面升级到 python3.8,过不了几天就可能有一大堆 python 依赖产生冲突,如果让人来看,很可能是先把什么拆了,然后装上什么,再拆掉什么,再装上什么……。但 emerge 分析不过来。这个时候就需要人来帮助分析,先手动拆除一部分,然后装一部分……。最极端的做法就是所有涉及冲突的全部 unmerge 掉。然后全部 emerge。这种做法一般是最省事的,也是风险最高的,弄不好系统就永远破了个大洞。因为你可以强制拆,但是不能强制装。

综上,对于一般人而言,解决软件包冲突的方案就是找出冲突成因,查看是否可以通过修改软件版本解决冲突,然后修改为合适的软件版本,重新编译安装。

特殊情况下,可能找到替代软件。如openjdkopenjdk-bin,如果后者需要的依赖更少,正好把冲突解决了,那么就可以通过软件替代来解决软件冲突。


文章作者: niuiic
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 niuiic !
评论
  目录