如何使 rpm 自动安装依赖项

Posted

技术标签:

【中文标题】如何使 rpm 自动安装依赖项【英文标题】:How to make rpm auto install dependencies 【发布时间】:2012-12-02 08:21:10 【问题描述】:

我已经构建了两个 RPM 包

proj1-1.0-1.x86_64.rpm libtest1-1.0-1.x86_64.rpm

proj1 取决于文件 libtest1.so 是否存在,它会正确反映在 RPM 包中,如下所示:

user@my-pc:~$ rpm -qp --requires proj1-1.0-1.x86_64.rpm
libtest1.so()(64bit)

user@my-pc:~$ rpm -qp --provides libtest1-1.0-1.x86_64.rpm
libtest1.so()(64bit)

由于缺少依赖项,proj1 的安装失败。

user@my-pc:~$ rpm -ivh proj1-1.0-1.x86_64.rpm
error: Failed dependencies:
libtest1.so()(64bit) is needed by proj1-1.0-1.x86_64.rpm

如何确保libtest1-1.0-1.x86_64.rpm在安装过程中自动安装 proj1-1.0-1.x86_64.rpm的安装?

我确实尝试了rpm -irpm -i--aid 选项,如here 所述,但它对我不起作用。

还有其他方法吗?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

将所有 RPM 复制到一个目录中,然后按如下方式安装:

yum install -y --cacheonly --disablerepo=* /var/rpm_dir/*.rpm

对于特定的包,您可以使用yumdownloader,例如在另一个线程中:https://***.com/a/66927190/5078874

【讨论】:

【参考方案2】:

从源文件生成 RPM 的过程: 1) 下载扩展名为.gz 的源文件。 2) 从 yum install 安装 rpm-build 和 rpmdevtools。 (将生成 rpmbuild 文件夹...SPECS、SOURCES、RPMS .. 文件夹应在 rpmbuild 文件夹内生成)。 3) 将源代码.gz 复制到 SOURCES 文件夹。(rpmbuild/SOURCES) 4) 使用以下命令解压缩 tar 球。 转到存在 tar 文件的 SOURCES 文件夹 :rpmbuild/SOURCES。 命令:例如 tar -xvzf httpd-2.22.tar.gz httpd-2.22 文件夹将在同一路径中生成。检查 apr 和 apr-util 是否在 httpd-2.22/srclib 文件夹中。如果 apr 和 apr-util 不存在,从 apache 站点下载最新版本,解压并将其放在 httpd-2.22/srclib 文件夹中。还要确保您的系统中安装了 pcre。

5) 转到提取的文件夹,然后键入以下命令: ./configure --prefix=/usr/local/apache2 --with-included-apr --enable-proxy --enable-proxy-balancer --with-mpm=worker --enable-mods-static=all 6)配置成功后运行以下命令: 制作 7)成功执行od make命令后运行: 检查安装 在同一个文件夹中。 (如果您没有 checkinstall 软件,请从网站下载最新版本) checkinstall软件也有bug,可以通过以下方式解决::::: 找到 checkinstallrc,然后使用 vim 命令将 TRANSLATE = 1 替换为 TRANSLATE=0。 还要检查排除包:EXCLUDE="/selinux" 8)checkinstall 会询问选项(如果你想要 tp build rpm 为源文件输入 R) 9) 完成的 .rpm 文件将建在 rpmbuild/RPMS 文件内的 RPMS 文件夹中... 万事如意....

问候, 普雷拉纳

【讨论】:

哪里有人问过要建造什么?这是关于解决已构建的 RPM 的依赖关系。【参考方案3】:

Step1:复制给定位置的所有 rpm pkg

Step2:如果createrepo尚未安装,默认情况下不会安装。

[root@pavangildamysql1 8.0.11_rhel7]# yum install createrepo

Step3:创建存储库元数据并授予以下权限

[root@pavangildamysql1 8.0.11_rhel7]# chown -R root.root /scratch/PVN/8.0.11_rhel7
[root@pavangildamysql1 8.0.11_rhel7]# createrepo /scratch/PVN/8.0.11_rhel7
Spawning worker 0 with 3 pkgs
Spawning worker 1 with 3 pkgs
Spawning worker 2 with 3 pkgs
Spawning worker 3 with 2 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@pavangildamysql1 8.0.11_rhel7]# chmod -R o-w+r /scratch/PVN/8.0.11_rhel7

Step4:在 /etc/yum.repos.d/mysql.repo 中创建包含以下内容的存储库文件

[local]
name=My Awesome Repo
baseurl=file:///scratch/PVN/8.0.11_rhel7
enabled=1
gpgcheck=0

Step5 运行此命令安装

[root@pavangildamysql1 local]# yum --nogpgcheck localinstall mysql-commercial-server-8.0.11-1.1.el7.x86_64.rpm

【讨论】:

【参考方案4】:

对于 openSUSE Leap 15,我收到了类似的错误:

> sudo rpm -i opera-stable_53.0.2907.68_amd64.rpm 
[sudo] password for root: 
warning: opera-stable_53.0.2907.68_amd64.rpm: Header V4 RSA/SHA512 Signature, key ID a5c7ff72: NOKEY
error: Failed dependencies:
    at is needed by opera-stable-53.0.2907.68-0.x86_64

我运行这个命令来找出依赖关系:

> sudo zypper install opera-stable_53.0.2907.68_amd64.rpm 
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 4 NEW packages are going to be installed:
  at libfl2 libHX28 opera-stable

4 new packages to install.
Overall download size: 50.3 MiB. Already cached: 0 B. After the operation, additional 176.9 MiB will be used.
Continue? [y/n/...? shows all options] (y): n

然后我运行这个命令来安装依赖:

> sudo zypper in at
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 3 NEW packages are going to be installed:
  at libfl2 libHX28

3 new packages to install.
Overall download size: 208.6 KiB. Already cached: 0 B. After the operation, additional 600.4 KiB will be used.
Continue? [y/n/...? shows all options] (y): y

然后我运行它来安装rpm 文件:

> sudo rpm -i opera-stable_53.0.2907.68_amd64.rpm

确定这是否是最佳做法,但它解决了我的问题。

【讨论】:

【参考方案5】:

简单只需运行以下命令。

sudo dnf install *package.rpm

输入你的密码,你就完成了。

【讨论】:

【参考方案6】:

马修的回答引起了很多情绪,因为它仍然缺少一个小细节。 一般命令是:

# yum --nogpgcheck localinstall <package1_file_name> ... <packageN_file_name>

上面的package_file_name 可以包含本地绝对路径或相对路径,或者是一个 URL(甚至可能是一个 URI)。

Yum 将在命令行上给出的所有包文件之间搜索依赖关系,如果无法找到那里的依赖关系,它还将使用任何已配置和启用的 yum 存储库。

不会搜索当前工作目录,也不会搜索任何package_file_name 的路径,除非这些目录中的任何一个先前已配置为启用的yum 存储库。

所以在 OP 的情况下,yum 命令:

# cd <path with pkg files>; yum --nogpgcheck localinstall ./proj1-1.0-1.x86_64.rpm ./libtest1-1.0-1.x86_64.rpm

会这样做,rpm 也会这样做:

# cd <path with pkg files>; rpm -i proj1-1.0-1.x86_64.rpm libtest1-1.0-1.x86_64.rpm

这些yumrpm 调用之间的差异只有在列出的要安装的软件包之一对命令行中未列出的软件包有进一步的依赖关系时才可见。

在这种情况下,rpm 将拒绝继续,而yum 将使用任何已配置和启用的 yum 存储库来搜索依赖项,并且可能会成功。

在任何情况下都不会搜索当前工作目录,除非它之前已配置为启用的yum 存储库。

【讨论】:

【参考方案7】:

我遇到了这个问题,对我有用的是从 .rpm 文件所在的目录中运行 yum localinstall enterPkgNameHere.rpm

注意:将 enterPkgNameHere.rpm 替换为 .rpm 文件的名称。

【讨论】:

【参考方案8】:

对我来说只是与

# yum install ffmpeg-2.6.4-1.fc22.x86_64.rpm

并自动请求授权以下载依赖项。 在示例下方,我使用的是 fedora 22

[root@localhost lukas]# yum install ffmpeg-2.6.4-1.fc22.x86_64.rpm
Yum command has been deprecated, redirecting to '/usr/bin/dnf install  ffmpeg-2.6.4-1.fc22.x86_64.rpm'.
See 'man dnf' and 'man yum2dnf' for more information.
To transfer transaction metadata from yum to DNF, run:
'dnf install python-dnf-plugins-extras-migrate && dnf-2 migrate'

Last metadata expiration check performed 0:28:24 ago on Fri Sep 25 12:43:44 2015.
Dependencies resolved.
====================================================================================================================
 Package               Arch           Version                                  Repository                      Size
====================================================================================================================
Installing:
 SDL                   x86_64         1.2.15-17.fc22                           fedora                         214 k
 ffmpeg                x86_64         2.6.4-1.fc22                             @commandline                   1.5 M
 ffmpeg-libs           x86_64         2.6.4-1.fc22                             rpmfusion-free-updates         5.0 M
 fribidi               x86_64         0.19.6-3.fc22                            fedora                          69 k
 lame-libs             x86_64         3.99.5-5.fc22                            rpmfusion-free                 345 k
 libass                x86_64         0.12.1-1.fc22                            updates                         85 k
 libavdevice           x86_64         2.6.4-1.fc22                             rpmfusion-free-updates          75 k
 libdc1394             x86_64         2.2.2-3.fc22                             fedora                         124 k
 libva                 x86_64         1.5.1-1.fc22                             fedora                          79 k
 openal-soft           x86_64         1.16.0-5.fc22                            fedora                         292 k
 opencv-core           x86_64         2.4.11-5.fc22                            updates                        1.9 M
 openjpeg-libs         x86_64         1.5.1-14.fc22                            fedora                          89 k
 schroedinger          x86_64         1.0.11-7.fc22                            fedora                         315 k
 soxr                  x86_64         0.1.2-1.fc22                             updates                         83 k
 x264-libs             x86_64         0.142-12.20141221git6a301b6.fc22         rpmfusion-free                 587 k
 x265-libs             x86_64         1.6-1.fc22                               rpmfusion-free                 486 k
 xvidcore              x86_64         1.3.2-6.fc22                             rpmfusion-free                 264 k

Transaction Summary
====================================================================================================================
Install  17 Packages

Total size: 11 M
Total download size: 9.9 M
Installed size: 35 M
Is this ok [y/N]: y

【讨论】:

我认为最简单的方法 不是直接的 rpm 解决方案,但我最喜欢这个。 不是 RPM 解决方案,但它是只用一个命令安装依赖项的最简单方法。这对我来说完美无缺【参考方案9】:

dnf 用户只需使用dnf install *.rpm,不再需要localinstall

【讨论】:

特地来这里说这个 谢谢,我正在努力安装mysql-workbenchrpm -ivh。最终以这篇文章结束。 DNF 成功了。【参考方案10】:

我找到了一个更简单的解决方案。如果您将所有 RPM 都放在同一个目录中,那么您需要做的就是,

$ sudo rpm -i *.rpm

rpm 似乎找出了安装这些并安装 RPM 的正确顺序。

【讨论】:

如果依赖项不在当前目录中,仍然无法处理。【参考方案11】:

@gertvdijk 提供的链接显示了一种无需配置本地存储库即可实现所需结果的快速方法:

$ yum --nogpgcheck localinstall packagename.arch.rpm

只需将 packagename.arch.rpm 更改为您要安装的 RPM 文件名即可。

编辑澄清一下,这将自动安装所有已通过系统 YUM 存储库可用的依赖项。

如果您的依赖项由不在系统存储库中的其他 RPM 满足,则此方法将不起作用,除非每个 RPM 也与命令行中的 packagename.arch.rpm 一起指定。

【讨论】:

不,除非libtest1-1.0-1.x86_64.rpm 在其他地方的存储库中,否则这将不起作用,或者两个包都在命令行上指定,如“rpm -i”需要。我刚刚在yum 3.4.3 (Fedora 18) 上验证了这一点。成绩单 here 显示它转到 updates 依赖项的存储库,即使文件就在那里。 @AaronD.Marasco 也许您对问题中描述的具体情况是正确的,但是对于像我一样在这里结束的任何人来说,这种单行话要容易得多,并且是完全有效的答案标题中的问题,“如何使 rpm 自动安装依赖项”。 不,它不是“自动安装”依赖项——您在命令行上指定它们,就像使用“rpm -i”一样,所以使用yum 不会给你额外的好处。 请重新阅读我写的内容。任何依赖项都是从存储库下载的,即使它们在您安装的 RPM 目录中本地可用。 @AaronD.Marasco 我并不是在争论其他发布的解决方案是否更适合 OP 询问的具体示例。但是,我的回答对于回答标题中的问题是正确的,并且比配置本地存储库快很多,并且将帮助像我一样在这里结束并想要快速获得 yum 的其他人自动安装 rpm 所需的依赖项。这就是堆栈溢出的目的,帮助社区寻找答案,而不仅仅是帮助 OP。【参考方案12】:

创建一个(本地)存储库并使用yum 让它为您解决依赖关系。

CentOS wiki 有一个不错的页面,提供了这方面的操作方法。 CentOS wiki HowTos/CreateLocalRepos.


总结并进一步最小化(不理想,但最快):

    为您的本地存储库创建一个目录,例如/home/user/repo。 将 RPM 移至该目录。

    修复一些所有权和文件系统权限:

    # chown -R root.root /home/user/repo
    

    如果尚未安装createrepo 包,请安装,然后运行

    # createrepo /home/user/repo
    # chmod -R o-w+r /home/user/repo
    

    创建一个存储库配置文件,例如/etc/yum.repos.d/myrepo.repo包含

    [local]
    name=My Awesome Repo
    baseurl=file:///home/user/repo
    enabled=1
    gpgcheck=0
    

    使用安装包

    # yum install packagename
    

【讨论】:

您提供的链接仅用这一行就解决了我的问题:yum --nogpgcheck localinstall packagename.arch.rpm @Matthew Cool,这将消除整个本地存储库步骤。将其发布为我想说的答案。 如果您尝试编写 RPM 脚本以像我一样在 AIX 上自动安装 YUM,这将无法正常工作 ;-) @Max13,即yum localinstall,它与the answer already posted here 相同,已经讨论过在 yum repos 中依赖关系 not 的情况的缺点(参见 除非 [...] 部分),否则此方法将不起作用。 如果没有互联网连接sudo yum --disablerepo=* --enablerepo=local install packagename.arch.rpm 也想出了这个,以确保yum 不会查看其他存储库。

以上是关于如何使 rpm 自动安装依赖项的主要内容,如果未能解决你的问题,请参考以下文章

在构建 RPM 包之前自动安装构建依赖项

使用rpm命令安装软件时不会自动安装所依赖的其它软件包。

15.Linux下Apache rpm包安装方法,并解决依赖性问题(附自动启动方法)

安装rpm包并自动安装依赖

centos7离线安装rpm包自动解决依赖

centos7.6安装teamviewer-原来还可以用yum 安装rpm包,自动解决依赖,太爽了