我想打包一个可以在 python2 和 python3 上运行的 python 应用程序,因为我们仍然有运行 python2 的旧系统。
默认应该是 python3,但如果未安装 python3。我想为 python2 构建它。不更改名称:
我已按照此处的说明进行操作:https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#_conditionalizing_the_python_2_parts
我尝试过这个:
%global srcname example
# Disable python2 by default
%bcond_with python2
Name: python-%{srcname}
Version: 1.2.3
Release: 1%{?dist}
Summary: An example python module
License: MIT
URL: https://pypi.python.org/pypi/%{srcname}
Source0: %pypi_source
BuildArch: noarch
%global _description %{expand:
A python module which provides a convenient example.}
%description %_description
%if %{with python2}
%package -n python2-%{srcname}
Summary: %{summary}
BuildRequires: python2-devel
%description -n python2-%{srcname} %_description
%endif
%package -n python3-%{srcname}
Summary: %{summary}
BuildRequires: python3-devel
%description -n python3-%{srcname} %_description
%prep
%autosetup -n %{srcname}-%{version}
%build
%if %{with python2}
%py2_build
%endif
%py3_build
%install
# Must do the python2 install first because the scripts in /usr/bin are
# overwritten with every setup.py install, and in general we want the
# python3 version to be the default.
%if %{with python2}
%py2_install
%endif
%py3_install
%check
%if %{with python2}
%{python2} setup.py test
%endif
%{python3} setup.py test
%if %{with python2}
%files -n python2-%{srcname}
%license COPYING
%doc README.rst
%{python2_sitelib}/%{srcname}/
%{python2_sitelib}/%{srcname}-*.egg-info/
%endif
%files -n python3-%{srcname}
%license COPYING
%doc README.rst
%{python3_sitelib}/%{srcname}/
%{python3_sitelib}/%{srcname}-*.egg-info/
%{_bindir}/sample-exec
%changelog
但它总是尝试构建两者,但都失败了,而且我需要更改包名称,例如python2-%{srcname}.
我需要它们具有相同的名称,它不是一个Python模块,它是一个独立的程序。
答案1
有两种不同的方法
第一个你已经概述了,但它需要深思熟虑。即做类似的事情
%if 0%{?rhel_version} < 800
Requires: policycoreutils-python
%else
Requires: policycoreutils-python-utils
%endif
在您为 RHEL-7.X 构建 1 个 RPM 和为 RHEL-8.X 构建 1 个 RPM 的情况下,在构建时您将传入一个版本变量rpmbuild
,在构建过程中它将执行模板化以确定哪些语句Requires
是写在RPM中。
这意味着您将有 2 个 RPM,并且这 2 个 RPM 必须单独托管。
另一种方法是使用布尔依赖关系转速(链接) RHEL(链接),这个功能不是“新的》(几年前就发布了,CentOS/RHEL-7平台应该支持它)。
这就像(我们将假装瞄准,AMAZON Linux 2023
因为它的python-unversioned-command
包使得这比在 RHEL 上容易得多)。
Requires: ( Py3-Dep or Py2-Dep )
Requires: ( ( python-unversioned-command >= 3.0.0 and Py3-Dep ) or ( python-unversioned-command < 3.0.0 and Py2-Dep ) )
从本质上讲,您不能同时安装Py3-Dep
和Py2-Dep
,并且如果有一些包裹是>=
另一个包。
这带来了一系列单独的复杂性,您可能需要找到一个包来构建这个条件。