Comment utiliser ensemble les plugins Python modernes d’emballage et setuptools


  • Français


  • Le packaging Python a beaucoup évolué. La dernière (“bêta”) utilise un fichier, pyproject.tomlpour contrôler le paquet.

    Un minimum pyproject.toml pourrait ressembler à ceci :

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

    [project]
    name = "cool_project"
    version = "1.0.0"

    La rubrique projet

    La projet section est les données sur le projet Python lui-même, y compris des champs comme Nom et versionqui sont nécessaires.

    D’autres champs sont souvent utilisés, notamment :

    • la description: Une description d’une ligne.
    • Lisez-moi: Emplacement d’un fichier README.
    • auteurs: Noms et e-mails des auteurs.
    • dépendances: Autres packages utilisés par ce projet.

    La section du système de construction

    Même s’il n’est pas nécessaire qu’il soit le premier, le système de construction va généralement au sommet. C’est parce que c’est le plus important.

    La build-backend points clés vers un module qui sait construire des distributions source et des roues à partir du projet. La a besoin champ permet de spécifier temps de construction dépendances.

    De nombreux projets sont construits avec outils de configuration. Il existe de nouvelles alternatives, comme voltiger et la trappe.

    Plugins

    Un avantage de la a besoin section dans système de construction est qu’il peut être utilisé pour installer plugins. La outils de configuration package, en particulier, peut utiliser des plugins pour modifier son comportement.

    Une chose que les plugins peuvent faire est de définir la version automatiquement. Il s’agit d’un besoin populaire car la gestion des versions peut souvent être pénible.

    Ségue

    Avant de continuer, il convient de réfléchir à la nature des “parodies”. UN parodie de X est un instance de X qui exagère certains aspects, souvent jusqu’à l’humour.

    Par exemple, une “parodie de film d’espionnage” est un film d’espionnage, même s’il riffe sur le genre.

    Une parodie de plugins setuptools

    Dans cet esprit, que serait une parodie d’un outils de configuration plugin ressemble? Selon la règle ci-dessus, il doit s’agir d’un plugin.

    Le plug-in, appelé onedotoh, définit la version sur… 1.0.0. Pour être un plugin, il doit d’abord être un package.

    Un paquet doit avoir un pyproject.toml:

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

    [project]
    name = "onedotoh"
    version = "1.0.0"

    [project.entry-points."setuptools.finalize_distribution_options"]
    setuptools_scm = "onedotoh:guess_version"

    Il y a une nouvelle rubrique : project.entry-points. Cela signifie que la fonction deviner_version sera appelé comme outils de configuration est prêt à finaliser les options de distribution.

    Le code de deviner_version est une ligne :

    def guess_version(dist):
        dist.metadata.version = "1.0.0"

    Version à 1.0.0

    Utilisant onedotoh est subtil. Un problème est d’écrire le pyproject.toml projet section pour ressembler à ceci:

    [project]
    name = "a_pyproject"
    version = "0.1.2"

    La version dans le pyproject.toml sera passer outre la version du plugin.

    La solution évidente consiste à retirer le version champ:

    [project]
    name = "a_pyproject"

    Cela échoue d’une manière différente. Sans le version dans le projet section, le fichier n’est pas valide. La Nom ne sera pas utilisé.

    La bonne façon de procéder est la suivante :

    [project]
    name = "a_pyproject"
    dynamic = ["version"]

    Cette approche déclare explicitement la version terrain comme dynamique.

    Un exemple complet ressemblera à ceci :

    [build-system]
    requires = [
        "setuptools",
        "onedotoh",
    ]
    build-backend = "setuptools.build_meta"

    [project]
    name = "a_pyproject"
    dynamic = ["version"]

    Enfin, la version est automatiquement définie sur 1.0.0.

    Emballer

    La outils de configuration Le plugin peut toujours être utilisé avec les packages Python modernes, tant que les fonctionnalités pertinentes sont explicitement déclarées comme “dynamiques”. Cela crée un champ propice à de nouvelles expérimentations avec l’automatisation.

    Par exemple, que se passerait-il si, en plus de deviner le version à partir de métadonnées externes, il devinerait également le nom, en utilisant le git à distance URL ?

    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