当存在较新版本的依赖软件时覆盖 yum 依赖检查
Posted
技术标签:
【中文标题】当存在较新版本的依赖软件时覆盖 yum 依赖检查【英文标题】:Overriding yum dependency checks when newer versions of the dependent software exist 【发布时间】:2010-10-14 05:00:38 【问题描述】:我在 CentOS 5.1 上使用 yum - 我从源代码手动编译 php 5.2.8,但使用 yum 安装了其他软件包。我需要通过 pecl 安装一个 PHP 扩展,它也需要安装 phpize。但是,执行以下操作会产生依赖错误:
sudo yum install php-devel
错误:缺少依赖项:php-devel 包需要 php = 5.1.6-20.el5_2.1
由于我实际上已经安装了更新版本的 PHP,我如何强制 yum 忽略它?我需要从源代码手动编译 pecl/phpize 吗?诚然,我以前从未遇到过问题,这似乎只是因为编译和 yum 安装的组合。
有什么想法吗?
谢谢, 凯尔
【问题讨论】:
我认为是手动编译或重新安装php(这次来自yum)。但我不确定。 【参考方案1】:一般:
如果你自己构建它,它会进入/usr/local
,并且只能被/usr/local
中的其他东西访问。
如果您从 RPM/Yum 安装,它会进入 /usr
,并且可供 /usr
和 /usr/local
访问。
因此,如果您想使用家庭编译的 PHP 安装 PHP 工具,请将它们也安装到 /usr/local
:通常,对于 GNU 类型的软件,会是这样的:
./configure --prefix=/usr/local && make && sudo make install
或
make prefix=/usr/local all && sudo make prefix=/usr/local install
…虽然大多数软件应该默认为/usr/local
,除非你覆盖它的前缀设置。
如果您想“手动构建”基于 RPM 的软件包,您可以使用
yumdownloader --source WHATEVER-PACKAGE
rpm -i WHATEVER-PACKAGE.rpm
rpmbuild -bp ~/rpm/SPECS/WHATEVER-PACKAGE.spec
(相当于~/rpm
的路径可能会有所不同;rpmbuild --showrc
会告诉你在哪里)
这会下载.src.rpm
包,其中包含上游(原作者的)源代码(通常是压缩包)以及特定于操作系统的补丁;将源安装到~/rpm
(或您的 rpmbuild 前缀);然后解压缩源并将补丁应用到~/rpm/BUILD/WHATEVER-PACKAGE/
从那里,您可以使用 /usr/local
前缀自己执行配置/制作步骤
当然,从 RPM 安装要容易得多 :-)
【讨论】:
【参考方案2】:yum
对您的手动编译的 php 版本一无所知。您可以通过使用 rpm --nodeps
安装软件包来绕过 RPM 的依赖解析,并希望它能正常工作。
或者把你自己编译的php版本安装在另一个目录,这样就可以和yum的旧版本共存了,这样大家就开心了(不知道能不能这样,我猜这要看你的app是否使用了php的硬编码路径与否)。
或者,如果你幸运的话,像 EPEL 或 RPMForge 这样的第三方存储库可能有一个更新的 php 包,所以你不必自己编译。
【讨论】:
【参考方案3】:根据经验,最好在系统中有一个包管理,因此最好将所有内容打包在 RPMS 中并通过 yum 进行管理。从长远来看,这将为您节省大量时间。
如果您绝对想从源代码中手动获得某些东西(fe PHP)编译器,请使用 stow/checkinstall/... 或任何其他可以让您对源代码编译的东西进行基本包管理的解决方案。
关于您的问题,您可以尝试通过下载所需软件包的 RPM 并执行“rpm -i --force file.rpm”来覆盖依赖性检查,因为 yum 没有任何强制安装选项
【讨论】:
--force
不适用于忽略依赖关系;你必须做--nodeps
。以上是关于当存在较新版本的依赖软件时覆盖 yum 依赖检查的主要内容,如果未能解决你的问题,请参考以下文章