如何创建假装提供Python模块的虚拟RPM?

时间:2017-07-26 19:24:12

标签: python rpm packaging rpm-spec python-packaging

我需要创建一个虚拟RPM,它似乎在站点包中安装了一些Python模块来解决RPM依赖问题。

真实模块将使用PIP在Python虚拟环境中安装,但为了使系统工作,需要在全局站点包中提供导入的模块,因此需要伪造。

导入如下(示例):from pear.apple.peach import Fruit

在具有这些导入的包上执行RPM Build时,它会在依赖项生成时失败,因此我需要在本地存储库中使用RPM来假装提供这些,以便依赖关系生成通过。

2 个答案:

答案 0 :(得分:1)

你在问题​​中提出的方法对我来说没有多大意义,你要么创建你需要的其他系统rpm包(你计划创建或安装的包)所需的python模块的rpm包,或者你只是使用虚拟环境然后你不需要太在意系统站点包中的内容,只要你安装了特定版本的python本身。虽然您可以在特定的虚拟环境中显示系统站点包(例如,当您在依赖项中有lxml模块时,可以从rpm包安装它,然后创建虚拟环境以访问系统站点包,这样您就不会需要在virtualenv中再次安装它,在虚拟rpm包中提供的特定模块会破坏它,所以这也没有意义。

换句话说,在虚拟环境中安装一些东西然后期望通过rpm包安装系统python模块来依赖于虚拟环境中的某些东西是不行的(imho)。

所以我建议做一个:

  • 构建您需要安装的模块的rpm包,以使其他软件包正常工作。只要您对rpmbuild有一些经验,就不应该那么难,您可以使用pyp2rpm工具来创建初始specfile,您需要稍微调整一下。但这还取决于您需要构建多少个软件包以及您计划更新它们的频率(因为它意味着更新specfile并重建)。
  • 仅使用虚拟环境,可以访问系统站点包。这样,您可以将依赖项和应用程序安装到虚拟环境中,并且根本不需要处理rpm包(只要从rpm包安装python和virtualenv)。

在你的情况下哪种方式更有意义在很大程度上取决于你想要做什么(你打算如何维护python模块,你计划安装多少台机器,如果你打算自己安装它或提供给其他人自己安装等等......)。

答案 1 :(得分:0)

我能够通过使用空文件复制每个导入并在每个文件夹级别使用空__init__.py个文件来解决此问题。

例如,要解决from pear.apple.peach import Fruit,我需要在site-packages中安装以下文件树:

-> pear
  -> __init__.py
  -> apple
    -> peach.py

虚拟rpm的spec文件的相关行:

...
source:FruitDummy.tar.gz    
...
% install
mkdir -p $RPM_BUILD_ROOT%{python_sitelib}/pear/apple/

install __init__.py $RPM_BUILD_ROOT%{python_sitelib}/pear/
install peach.py $RPM_BUILD_ROOT%{python_sitelib}/pear/apple/
...
%files
%defattr(-,root,root,-)
%{python_sitelib}/pear/__init__.py*
%{python_sitelib}/pear/apple/peach.py*
...

__init__.pypeach.py存储在用于构建RPM的FruitDummy.tar.gz中。