如何安装另一个 rpm 作为另一个 rpm 的依赖项?

如何安装另一个 rpm 作为另一个 rpm 的依赖项?

我们已经使用 fpm 构建了应用程序 rpm 文件。我们已将 python3 设置为依赖项,因此它会在主 rpm 之前自动安装。

但是它安装的是 3.7。要将其替换为 3.8,我们需要先检查操作系统版本是 centos 还是 awslinux,然后根据此版本安装特定的 rpm。

所以,我将这些条件块保留在预安装脚本中并传递给参数--before-install。

但是,它在 rpm 安装过程中卡住了。

因此,当我使用详细模式检查时,我发现它无法与 preinst 配合使用。

原因是,ptyhon install 无法应用锁并继续安装,因为 projectn 已经获得锁。

RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.


+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.

您可以提供任何建议

欲了解更多详情,请参阅下文。

创建rpm使用的工具:平均流量 我需要安装 python3.8 作为应用程序 rpm 的依赖项。

如果我使用 -d python3 将其设置为依赖项,则会在 amazon linux 上安装 3.7 版本,在 centos 8 上安装 3.6 版本。要使用 3.8 版本,在安装包之前还需要执行一些其他步骤。

因此,我从依赖部分删除了 python3,并添加了 --before-install 作为 shell 脚本。

这是我保存在那里的 shell 脚本。

#!/bin/bash
echo "Starting preinst"

echo "Checking OS Version"


DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"' | tr '[:upper:]' '[:lower:]')

if [[ "$DISTRO" =~ "centos linux" ]]; then
  echo "centos is detected"
  sudo yum install -yq python38
elif [[ "$DISTRO" =~ "amazon linux" ]]; then
  echo "amazon linux detected"
  sudo yum install -yq amazon-linux-extras
  sudo amazon-linux-extras enable python3.8
  sudo yum install -yq python3.8
elif [[ "$DISTRO" =~ "ubuntu" ]]; then
  echo "ubuntu detected"
  sudo apt install pyhton3 -yq
else
  echo "Neither centos nor amazon linux 2"
fi

它正在触发脚本,但停留在从 shell 脚本进行的 python 安装上。

RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.


+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.

对于如何解决这个问题,有任何的建议吗?

我的要求是将 python3.8 安装为我们的商品 rpm 的一部分,同时也作为依赖项。

答案1

在另一个 rpm 脚本中安装 rpm 不起作用。已在 rpm 事务中。此外,依赖项不在包元数据中,yum/dnf 无法解析它们。这两种情况都会带来糟糕的用户体验。

通过创造性地使用条件,可以在一个 rpm 规范中使用多个发行版。假设您至少需要 Python 3.8。借鉴各种 rpm 包在 CentOS 中 以及其他地方,build dep 可能看起来像:

%if 0%{?fedora} || 0%{?rhel} > 8 
BuildRequires: python3-devel
%endif
%if 0%{?amzn} || 0%{?rhel} == 8 || 0%{?suse_version} > 1500
BuildRequires: python38-devel
%endif

注意奇怪的以零为前缀的数字。即使变量未定义,这也允许在表达式中使用。

继续Fedora 的 Python 打包指南或 EL) %安装该东西。有一点很棘手:对于其中一些发行版,Python 是 /usr/bin/python3,而对于其他发行版,则是 /usr/bin/python38。可能希望将其设为变量。

默认情况下,Amazon extra repo python3.8 未启用。请为软件包构建启用它,例如在 mock 工具的 repos 中。用户还需要启用 repo 才能安装这些软件包。

Fedora 打包宏通常会为安装在典型位置(如 %{python3_sitelib})的 python 模块生成适当的依赖项。我不知道 amzn 对此做了什么,可能是一样的。如果没有,您可能需要添加手动依赖项,例如Requires: python(abi) = 3.8

在每个感兴趣的发行版上构建生成的 spec 文件:Fedora、RHEL、Amazon Linux、CentOS Stream、SUSE。虽然每个发行版的软件包略有不同,这很烦人,但它为用户带来了轻松的 yum 安装体验。

Debian 软件包对于读者来说是一项练习。


像 fpm 这样的自动软件包生成器可能无法输出像软件包那样巧妙的软件包。典型的权衡:快速生成器支持多个发行版,而人工打包者可以根据多个发行版的怪癖做一些有目的的事情。

相关内容