Packager un nouveau module Python en 4 étapes


  • Français


  • 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

    Houssen Moshinaly

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Copy code