尽管安装了库,但仍存在 YUM 依赖问题

尽管安装了库,但仍存在 YUM 依赖问题

我们从源代码构建了自己的 php 和 mysql 包,这个包适用于 php-5.4.10 版本,并将它们托管在我们自己的存储库中。我们将这个包称为 custom-php 和 custom-mysql(-libs & -server)

当我在服务器上执行 yum install custom-php 时,yum 列出了依赖性问题:

--> Finished Dependency Resolution
Error: Package: custom-php-1.1.x86_64 (php)
           Requires: libmysqlclient.so.18(libmysqlclient_16)(64bit)
Error: Package: custom-php-1.1.x86_64 (php)
           Requires: libmysqlclient.so.18(libmysqlclient_18)(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

文件 libmysqlclient.so.18 由 custom-mysql-libs 提供,该文件在 custom-php 的 spec 文件中的 Requires 下列出。即使我在发出 yum install custom-php 之前手动安装 custom-mysql-libs,我仍然会收到上述错误。

我们的 custom-mysql-libs 是从 mysql 源代码构建的,并提供了 libmysqlclient.so:

$ rpm -qlp custom-mysql-libs-1.0.x86_64.rpm 
/custom/lib64/libmysqlclient.so
/custom/lib64/libmysqlclient.so.18
/custom/lib64/libmysqlclient.so.18.0.0
....
$ 

当我们将库安装在不同的地方时,custom-mysql-libs 在完成后会发出一个 ldconfig,其路径在 /etc/ld.so.conf.d/ 下的文件中指定。我使用 ldconfig -v 验证了库是否可见

# ldconfig -v
...
/custom/lib64:
        libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
...
#

Yum 也找到了库和包:

# yum whatprovides */libmysqlclient.so.18
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
custom-mysql-libs-1.0.x86_64 : Custom MySQL libraries
Repo        : custom
Matched from:
Filename    : /custom/lib64/libmysqlclient.so.18

custom-mysql-libs-1.0.x86_64 : Custom MySQL libraries
Repo        : installed
Matched from:
Filename    : /custom/lib64/libmysqlclient.so.18

任何帮助都值得感激。谢谢!

答案1

rpm 对本地文件系统一无所知。它只在自己的数据库中查找系统上的内容。就您而言,这是一个放置库的非标准位置。通常,标准位置是 ,/usr/lib64/mysql/而您的位置是 /custom,因此 rpm 无法在它应该在的位置找到它。

这里有两个选择。

1)通过添加一些符号链接来重建自定义的,这可能会起作用(确实未经测试)

2)使用 --no-deps 标志强制安装,并将 mysqllibrary 文件从 /custom 符号链接到 /usr/lib64/mysql/

我认为我们无法给你提供任何神奇的命令来让它按照你希望的方式工作。

答案2

yum 和 rpm 无法跟踪您在其背后所做的任何事情。因此,如果您在标准软件包发行版之外安装东西,像 yum 这样巧妙的助手没有足够的编程来预测这一点。您必须承担更多责任来手动处理此类错误。

通常,我的做法是尽量不绕过系统,而是尽可能使用打包系统。例如,如果我按照我的规范重新构建一个包,我会下载包的源代码,然后在进行修改等之后重新制作一个新包。

答案3

我们在将库安装到非标准位置的第三方 RPM 中也遇到了类似的问题。您可以在 spec 文件中关闭自动依赖项处理,然后按包名称列出依赖项。例如,在您的 custom-php spec 文件中添加:

AutoReqProv: no
Requires: custom-mysql

不要忘记添加您可能需要的任何其他依赖项。

相关内容