Contents

将whl依赖打包成RPM

项目上在适配信创环境(统信系统UOS),遇到了python3相关的依赖问题,UOS官方源中提供的cherrypy版本过低,通过pip3才能安装最新的cherrypy版本,但是项目是通过yum来管理依赖,所以需要将cherrypy打包成rpm包,然后通过yum来安装。

本文提供了一种暴力的方式,直接通过pip3 download将相关联的whl都下载下来,然后编写spec文件,然后将这些whl包都打包成一个rpm包

当通过yum install这个rpm包的时候,执行python3 -m pip install *.whl的方式将这个whl安装好

项目结构

新建一个项目,类似如下,将所有的whl放在BUILD/dist目录下

➜ tree python3-CherryPy-uel20/  
python3-CherryPy-uel20/
├── BUILD
│   └── dist
│       ├── CherryPy-18.9.0-py3-none-any.whl
│       ├── Routes-2.5.1-py2.py3-none-any.whl
│       ├── autocommand-2.2.2-py3-none-any.whl
│       ├── cheroot-10.0.1-py3-none-any.whl
│       ├── importlib_metadata-6.7.0-py3-none-any.whl
│       ├── importlib_resources-5.12.0-py3-none-any.whl
│       ├── inflect-6.0.5-py3-none-any.whl
│       ├── jaraco.collections-4.2.0-py3-none-any.whl
│       ├── jaraco.context-4.3.0-py3-none-any.whl
│       ├── jaraco.functools-3.7.0-py3-none-any.whl
│       ├── jaraco.text-3.11.1-py3-none-any.whl
│       ├── more_itertools-9.1.0-py3-none-any.whl
│       ├── portend-3.1.0-py3-none-any.whl
│       ├── pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
│       ├── pytz-2024.1-py2.py3-none-any.whl
│       ├── repoze.lru-0.7-py3-none-any.whl
│       ├── setuptools-68.0.0-py3-none-any.whl
│       ├── six-1.16.0-py2.py3-none-any.whl
│       ├── tempora-5.3.0-py3-none-any.whl
│       ├── typing_extensions-4.7.1-py3-none-any.whl
│       ├── zc.lockfile-3.0.post1-py3-none-any.whl
│       └── zipp-3.15.0-py3-none-any.whl
├── BUILDROOT
├── RPMS
│   └── x86_64
│       └── python3-CherryPy-18.9.0-1.uel20.x86_64.rpm
├── SOURCES
├── SPECS
│   └── python3-CherryPy.spec
└── SRPMS

9 directories, 24 files

SPEC

编写SPECS/python3-CherryPy.spec 文件,内容如下:

# Created by lakemei
%global pypi_name CherryPy
%global pypi_version 18.9.0

Name:           python3-%{pypi_name}
Version:        %{pypi_version}
Release:        1%{?dist}
Summary:        Object-Oriented HTTP framework

License:        None
URL:            https://www.cherrypy.dev
Source0:        %{pypi_source}
BuildArch:      x86_64

%description
 .. image::

%install
# _prefis 指/usr
# buildroot指BUILDROOT
mkdir -p %{buildroot}%{_prefix}/lib/python3.7/site-packages/
# 将所有的whl拷贝到BUILDROOT/usr/lib/python3.7/site-packages/下
cp -r %{_builddir}/dist/*.whl %{buildroot}%{_prefix}/lib/python3.7/site-packages/

%build
# 构建阶段不需要特别操作

%files
# 指明rpm需要将/usr/lib/python3.7/site-packages/目录下的所有的whl包含进来,打成一个rpm包
%{_prefix}/lib/python3.7/site-packages/*.whl

%post
# yum安装时使用pip安装wheel文件
python3 -m pip install --no-cache-dir %{_prefix}/lib/python3.7/site-packages/*.whl

%preun
# 卸载
python3 -m pip uninstall CherryPy -y

%changelog
* Fri May 10 19:15:34 CST 2024 - lakemei - 18.9.0
- Initial package.

构建

构建需要将上面的项目放在对应环境/root/rpmbuil/目录下

然后执行rpmbuild命令打包

rpmbuild -ba /root/rpmbuild/SPECS/python3-CherryPy.spec

会发现遇到如下报错:

Bytecompiling .py files below /root/rpmbuild/BUILDROOT/python3-CherryPy-18.9.0-1.uel20.x86_64/usr/lib/python3.7 using /usr/bin/python3.7
+ /usr/lib/rpm/brp-python-hardlink
error: Bad file: /root/rpmbuild/SOURCES/CherryPy-18.9.0.tar.gz: No such file or directory


RPM build errors:
    Bad file: /root/rpmbuild/SOURCES/CherryPy-18.9.0.tar.gz: No such file or directory

提示没有SOURCES/CherryPy-18.9.0.tar.gz这个源码文件包,因为我们单纯的打包whl,没有源码,所以这里创建一个空的CherryPy-18.9.0.tar.gz文件, 如下

# cd SOURCES/
# mkdir usr
# tar -czvf CherryPy-18.9.0.tar.gz usr
# rm -r usr

最后再次执行rpmbuild构建命令

rpmbuild -ba /root/rpmbuild/SPECS/python3-CherryPy.spec

会发现构建成功,并且在RPMS/目录下出现构建出来的rpm包python3-CherryPy-18.9.0-1.uel20.x86_64.rpm

rpm包结构

通过rpm -qlp看一下打包出来的rpm包的内部结构:

# rpm -qlp python3-CherryPy-18.9.0-1.uel20.x86_64.rpm
/usr/lib/python3.7/site-packages/CherryPy-18.9.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/Routes-2.5.1-py2.py3-none-any.whl
/usr/lib/python3.7/site-packages/autocommand-2.2.2-py3-none-any.whl
/usr/lib/python3.7/site-packages/cheroot-10.0.1-py3-none-any.whl
/usr/lib/python3.7/site-packages/importlib_metadata-6.7.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/importlib_resources-5.12.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/inflect-6.0.5-py3-none-any.whl
/usr/lib/python3.7/site-packages/jaraco.collections-4.2.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/jaraco.context-4.3.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/jaraco.functools-3.7.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/jaraco.text-3.11.1-py3-none-any.whl
/usr/lib/python3.7/site-packages/more_itertools-9.1.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/portend-3.1.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
/usr/lib/python3.7/site-packages/pytz-2024.1-py2.py3-none-any.whl
/usr/lib/python3.7/site-packages/repoze.lru-0.7-py3-none-any.whl
/usr/lib/python3.7/site-packages/setuptools-68.0.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/six-1.16.0-py2.py3-none-any.whl
/usr/lib/python3.7/site-packages/tempora-5.3.0-py3-none-any.whl
/usr/lib/python3.7/site-packages/typing_extensions-4.7.1-py3-none-any.whl
/usr/lib/python3.7/site-packages/zc.lockfile-3.0.post1-py3-none-any.whl
/usr/lib/python3.7/site-packages/zipp-3.15.0-py3-none-any.whl