Site icon Maniac Geek

Packager un nouveau module Python en 4 étapes

Lorsque vous installez une application, vous installez généralement un package qui contient le code exécutable d’une application et des fichiers importants tels que la documentation, les icônes, etc. Sous Linux, les applications sont généralement conditionnées sous forme de fichiers RPM ou DEB, et les utilisateurs les installent avec le dnf ou apt commandes, selon la distribution Linux. Cependant, de nouveaux modules Python sont publiés pratiquement tous les jours, vous pouvez donc facilement rencontrer un module qui n’a pas encore été empaqueté. Et c’est exactement pourquoi le pyp2rpm commande existe.

Récemment, j’ai essayé d’installer un module appelé python-concentration. Ça ne s’est pas bien passé :

$ sudo dnf install python-concentration
Updating Subscription Management repositories.
Last metadata expiration check: 1:23:32 ago on Sat 11 Jun 2022 06:37:25.
No match for argument: python-concentration
Error: Unable to find a match: python-concentration

C’est un package PyPi, mais il n’est pas encore disponible en tant que package RPM. La bonne nouvelle est que vous pouvez créer vous-même un RPM avec un processus relativement simple en utilisant pyp2rpm.

Vous aurez besoin de deux répertoires pour commencer :

$ mkdir rpmbuild
$ cd rpmbuild && mkdir SPECS

Vous devrez également installer pyp2rpm:

$ sudo dnf install pyp2rpm

1. Générez le fichier de spécifications

La base de tout package RPM est un fichier appelé le fichier de spécifications. Ce fichier contient toutes les informations sur la façon de construire le package, les dépendances dont il a besoin, la version de l’application qu’il fournit, les fichiers qu’il installe, etc. Lorsqu’il pointe vers un module Python, pyp2rpm génère un fichier de spécifications pour celui-ci, que vous pouvez utiliser pour créer un RPM.

En utilisant python-concentration comme exemple arbitraire, voici comment générer un fichier spec :

$ pyp2rpm concentration > ~/rpmbuild/SPECS/concentration.spec

Et voici le fichier qu’il génère :

# Created by pyp2rpm-3.3.8
%global pypi_name concentration
%global pypi_version 1.1.5

Name:           python-%{pypi_name}
Version:        %{pypi_version}
Release:        1%{?dist}
Summary:        Get work done when you need to, goof off when you don't

License:        None
URL:            None
Source0:        %{pypi_source}
BuildArch:      noarch

BuildRequires:  python3-devel
BuildRequires:  python3dist(setuptools)

%description
Concentration [![PyPI version]( [![Test Status]( [![Lint Status]( [![codecov](

%package -n     python3-%{pypi_name}
Summary:        %{summary}
%{?python_provide:%python_provide python3-%{pypi_name}}

Requires:       (python3dist(hug) >= 2.6.1 with python3dist(hug) < 3~~)
Requires:       python3dist(setuptools)
%description -n python3-%{pypi_name}
Concentration [![PyPI version]( [![Test Status]( [![Lint Status]( [![codecov](

%prep
%autosetup -n %{pypi_name}-%{pypi_version}

%build
%py3_build

%install
%py3_install

%files -n python3-%{pypi_name}
%license LICENSE
%doc README.md
%{_bindir}/concentration
%{python3_sitelib}/%{pypi_name}
%{python3_sitelib}/%{pypi_name}-%{pypi_version}-py%{python3_version}.egg-info

%changelog
*  - 1.1.5-1
- Initial package.

2. Exécutez rpmlint

Pour vous assurer que le fichier de spécifications est conforme aux normes, exécutez le rpmlint commande sur le fichier :

$ rpmlint ~/rpmbuild/SPEC/concentration.spec
error: bad date in %changelog: - 1.1.5-1
0 packages and 1 specfiles checked; 0 errors, 0 warnings.

Il semble que l’entrée du journal des modifications nécessite une date.

%changelog
* Sat Jun 11 2022 Tux <tux@example.com> - 1.1.5-1

Essayer rpmlint encore:

$ rpmlint ~/rpmbuild/SPEC/concentration.spec
0 packages and 1 specfiles checked; 0 errors, 0 warnings.

Succès!

3. Téléchargez le code source

Pour construire un package RPM, vous devez télécharger le code que vous empaquetez. Pour ce faire, la méthode la plus simple consiste à analyser votre fichier de spécifications pour trouver l’emplacement du code source sur Internet.

Tout d’abord, installez le spectool commande avec dnf:

$ sudo dnf install spectool

Utilisez-le ensuite pour télécharger le code source :

$ cd ~/rpmbuild
$ spectool -g -R SPEC/concentration.spec
Downloading: https://files.pythonhosted.org/...concentration-1.1.5.tar.gz
   6.0 KiB / 6.0 KiB    [=====================================]
Downloaded: concentration-1.1.5.tar.gz

Cela crée un répertoire SOURCES et y place l’archive du code source.

4. Construisez le paquet source

Maintenant que vous avez un fichier de spécification valide, il est temps de créer le paquet source avec le rpmbuild commande. Si vous n’avez pas rpmbuild encore, installez le package rpm-build avec dnf (ou acceptez l’offre de votre terminal d’installer ce package lorsque vous essayez d’utiliser le rpmbuild commande).

$ cd ~/rpmbuild
$ spectool -g -R SPEC/concentration.spec
Downloading: https://files.pythonhosted.org/...concentration-1.1.5.tar.gz
   6.0 KiB / 6.0 KiB    [=====================================]
Downloaded: concentration-1.1.5.tar.gz

La -bs l’option signifie construire la source. Cette option vous donne un src.rpm file, un package polyvalent qui doit être reconstruit pour une architecture spécifique.

Créez un RPM installable pour votre système :

$ rpmbuild –rebuild SRPMS/python-concentration-1.1.5-1.el9.src.rpm
error: Failed build dependencies:
        python3-devel is needed by python-concentration-1.1.5-1.el9.noarch

Il semble que ce package nécessite les bibliothèques de développement de Python. Installez-les pour continuer la construction. Cette fois, la construction réussit et rend beaucoup plus de sortie (que j’abrège ici pour plus de clarté):

$ sudo dnf install python3-devel -y
$ rpmbuild –rebuild SRPMS/python-concentration-1.1.5-1.el9.src.rpm
[...]
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.TYA7l2
+ umask 022
+ cd /home/bogus/rpmbuild/BUILD
+ rm -rf concentration-1.1.5
+ RPM_EC=0
++ jobs -p
+ exit 0

Votre package RPM a été construit dans le sous-répertoire RPMS. Installez-le comme d’habitude avec dnf:

$ sudo dnf install RPMS/noarch/python3-concentration*rpm

Pourquoi ne pas simplement utiliser PyPi ?

Il n’est pas absolument nécessaire de transformer un module Python en un RPM. L’installation d’un module avec PyPi est également acceptable, mais PyPi ajoute un autre gestionnaire de paquets à votre liste personnelle de choses à vérifier et à mettre à jour. Lorsque vous installez un RPM en utilisant dnf, vous disposez d’une liste complète de ce que vous avez installé sur votre système. Grâce à pyp2rpmle processus est rapide, facile et automatisable.

Source

Quitter la version mobile