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
Contents
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.5Name: python-%{pypi_name}
Version: %{pypi_version}
Release: 1%{?dist}
Summary: Get work done when you need to, goof off when you don'tLicense: None
URL: None
Source0: %{pypi_source}
BuildArch: noarchBuildRequires: python3-devel
BuildRequires: python3dist(setuptools)%description
Concentration [ >= 2.6.1 with python3dist(hug) < 3~~)
Requires: python3dist(setuptools)
%description -n python3-%{pypi_name}
Concentration [.
$ 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 à pyp2rpm
le processus est rapide, facile et automatisable.