将whl依赖打包成RPM
Contents
项目上在适配信创环境(统信系统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