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完全按照软件包生成器的指示执行这些命令,从而消除了安装过程中常见的问题根源。
...如果不在.noarch.rpm
文件的%install
字段中,我应该在哪里指定在安装软件包之前运行的命令?
答案 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
。永远。