python - 停止 rpmbuild 重写需要
问题描述
我正在从 Python 包构建二进制 RPM。该包使用自定义.spec
文件,这是一个硬性要求。(python setup.py bdist_rpm
根本不够灵活。)
例如,.spec
文件的片段如下所示:
%else
%if 0%{?rhel} >= 7
BuildRequires: python2-devel
BuildRequires: python-setuptools
Requires: python(abi) = 2.7
Requires: python2-boto >= 2.5.0
Requires: python2-cryptography < 3
该过程是:
- 创建一个 sdist 并将其放在 SOURCES (
%{_sourcedir}
)下 - 称呼
rpmbuild -bb <path-to.spec>
规范文件的内容如下所示:
%prep
%setup -q -n %{name}-%{unmangled_version}
%build
%if %{with_python2}
%py2_build
%endif
%if %{with_python3}
%py3_build
%endif
%install
%if %{with_python2}
%{__python2} setup.py install --single-version-externally-managed -O1 --root=%{buildroot} --record=INSTALLED_FILES
%endif
%if %{with_python3}
%{__python3} setup.py install --single-version-externally-managed -O1 --root=%{buildroot} --record=INSTALLED_FILES
%endif
为简化起见,我们可以忘记条件检查,只指定一个无条件要求:
Requires: PyYAML
问题出在rpmbuild
某处将其破坏Requires:
为一组完全不同的要求。
$ rpm -qp --requires /root/rpmbuild/RPMS/noarch/path-to-project3.0.0-1.noarch.rpm
/bin/bash
/usr/bin/env
/usr/bin/python
/usr/bin/python2
python(abi) = 2.7
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PartialHardlinkSets) <= 4.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
要求明显PyYAML
缺失。
构建发生在 CentOS 7 Docker 容器上,无论我尝试什么,我都无法单独rpmbuild
留下这些部分。Requires:
我尝试过:
%undefine __pythondist_requires
setup.py --quiet egg_info --egg-base /tmp sdist
一切都无济于事。
我如何才能rpmbuild
忠实于实际.spec
文件?
MVCE
我在https://github.com/bsolomon1124/test-so-7954504建立了一个 MVCE 项目。那里的自述文件包含完整的重现说明,也显示在此处:
克隆项目。
运行容器:
docker container run -it --rm --volume "$(pwd)":/io --workdir /io --entrypoint bash centos:7
设置并构建将被放入的 RPM dist/
:
$ yum update -y
$ yum install -y make
$ make setup_build
$ make rpm
检查要求,看到.spec
文件中的那些被忽略:
[root@xxxxxx io]# rpm -qp --requires dist/myproj-0.1-1.noarch.rpm
python(abi) = 2.7
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PartialHardlinkSets) <= 4.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
解决方案
推荐阅读
- php - MySQL 查询以防止嵌套树
- git - 替换图像或文本时的语义提交类型?
- javascript - 使用谷歌应用脚本返回多次出现的值
- docker - Jenkins Job 如何将 docker 映像提升到下一个环境
- python - 如何用 Beautifulsoup 处理嵌套的 html 表?
- css - 如何覆盖背景图像上的导航栏?
- c# - EF 与数据库上的字段失去连接
- asp.net - 为什么我在尝试通过 HTTPS 访问 apple-touch-icon.png 时收到错误 403,但在浏览器中进行测试时会出现 200?
- node.js - 如何知道客户端在我的 Web 应用程序中发出的请求数
- python - 在特定字符后提取浮点数