安装RPM不会运行.spec中列出的所有%install操作。

时间:2018-10-19 20:53:09

标签: linux rpm rpmbuild rpm-spec

TL; DR:我制作了一个.spec文件,该文件成功构建了.rpm,但是rpm -i <file>.rpm并没有执行我认为应该执行的所有操作。为什么?

摘录自<file>.spec

%install
sudo python2.7 -m pip install 'tornado<5'
...#other pip commands...
cp -r $RPM_BUILD_DIR/%{name}-%{version}/* %{buildroot}

(我知道这不是理想的方法,但是由于公司/共享环境,我被迫使用CentOS 6并且无法升级python的系统版本,所以这是我能想到的最好方法

在构建%install时,.rpm下的所有命令都正确运行,因此所有pip软件包都安装在从{{ 1}}。 .rpm.spec结尾。但是,当我尝试安装创建的rpmbuild -ba <file>.spec文件(在具有相同OS /体系结构的另一个系统上)时,所有发生的事情是安装了rpm指定的依赖项,并将文件推到了正确的目录,但是exit 0中的其他命令未运行。最终发生的事情是,我尝试调用生成的可执行文件,由于缺少python软件包,它会出错。

RPM.org says:

  

执行安装前所需的所有任务:

     

在某些情况下,必须在实际安装软件包之前发出一个或多个命令。 RPM完全按照软件包生成器的指示执行这些命令,从而消除了安装过程中常见的问题根源。

...如果不在.noarch.rpm文件的%install字段中,我应该在哪里指定在安装软件包之前运行的命令?

3 个答案:

答案 0 :(得分:3)

如果要在安装rpm之后运行命令,则需要将这些命令放在%post目标中。

如果要在安装rpm本身之前立即运行命令,请将命令放在%pre目标中。

{。{1}}中的命令在构建.rpm时执行,而在安装.rpm时不运行。

%install旨在将软件安装到沙盒目录层次结构中,然后将其打包并包含在.rpm文件中。

请勿在%install中运行会更改任何系统状态或影响$ RPM_BUILD_DIR或%{buildroot}之外的任何内容的命令

答案 1 :(得分:1)

%install脚本let在构建过程中运行,而不是在安装过程中运行。

如果希望在安装软件包时运行命令,则需要使用spec文件中的%post部分。

答案 2 :(得分:0)

正如其他人所指出的,%install是规范文件中的脚本部分,用于复制%build阶段已编译的文件(可以是适用于python)。但是,其他人尚未注意到sudo python2.7 -m pip install 'tornado<5'绝对不是您应该在specfile中使用的命令。您需要以其他方式获取python文件,并将它们安装到%{buildroot}下的正确位置。

RPM不应构建为 root用户,也不要在任何地方调用sudo 。永远。