URL: https://linuxfr.org/news/le-gestionnaire-de-projet-poetry-1-0-0-est-disponible Title: Le gestionnaire de projet Poetry 1.0.0 est disponible ! Authors: Étienne BERSAC Davy Defaud, Benoît Sibaud, Xavier Teyssier et palm123 Date: 2019-12-16T16:22:34+01:00 License: CC by-sa Tags: poetry et gestionnaire_de_projet Score: 4 L’outil de gestion de projets Python Poetry est sorti en version 1.0.0 ! Sa date de naissance est officiellement le jeudi 12 décembre 2019. Poetry est un programme en ligne de commande permettant aux développeurs de gérer les métadonnées d’un projet, les dépendances, l’environnement de développement, la génération de livrables, la publication, l’environnement d’exécution et d’autres choses. Le tout de manière unifiée. À l’origine du projet se trouve le Français [Sébastien Eustace](https://eustace.io). À partir de cette version 1.0.0, le projet Poetry est géré par une équipe nommé sobrement _python-poetry_ avec son propre site et sa propre organisation GitHub. ---- [Page du projet python-poetry.org](https://python-poetry.org) [Projet sur GitHub](https://github.com/python-poetry/poetry) [Historique de l’empaquetage de projet Python par PyPA](https://www.pypa.io/en/latest/history/) [Annonce officielle de Poetry 1.0.0](https://python-poetry.org/blog/announcing-poetry-1-0-0.html) ---- Python a beaucoup d’héritage pour la gestion de projet : _distutils, eggs, setuptools, easy_install, virtualenv, pip, wheel, pip-tools, twine, pipenv,_ etc. Cela fait beaucoup d’outils, qui se complètent, se succèdent avec plus ou moins de coopération. Petit rappel des besoins d’un développeur Python : - définir les métadonnées du projet : nom, version, etc. ; - définir le contenu du projet : code, ressources, docs ; - définir les dépendances d’exécution et de développement ; - figer les versions des dépendances, en respectant les incompatibilités ; - isoler l’exécution du projet (en dév, en prod) avec un _virtualenv_ et _pyenv_ ; - générer un livrable (du projet, de l’environnement) : source (`.tar.gz`) et binaire (`.whl`) ; - publier ce livrable sur un dépôt public comme [PyPI](https://pypi.org). # Historique de la gestion de projet Python Voici une petite tentative de récapitulatif simplifié (!) de l’historique de la gestion de projet de Python. Au début, on ne génère que des sources avec un fichier `setup.py`, retenez‑le bien ! `python setup.py install` installe le projet. `setup.py` appelle `distutils.setup`. Charge aux distributions de faire des paquets binaires, de gérer les dépendances. L’entreprise TeleCommunity apporte sa contribution : `setuptools`. Ce projet inclut : une surcouche extensible à `distutils.setup`, **la commande `easy_install`** pour télécharger et installer un projet et ses dépendances, le **format egg** inspiré du format JAR, un API `pkg_resources` pour inspecter l’installation de projets (métadonnées et fichiers ressources). Il reste des problèmes. Par exemple, on ne peut pas désinstaller un projet. Mais avec l’avantage du premier arrivé, l’adoption est massive. Le prolifique [Ian Bicking](http://www.ianbicking.org/) invente les ***virtualenvs*** et **pip**. Un _virtualenv_ est un duo de dossiers `site-packages` et `bin` où sont installés des paquets Python. Quand on active le _virtualenv_, on injecte ces dossiers respectivement en début de `PYTHONPATH` et `PATH`. Cela évite de polluer `~/.local`, `~/bin` ou pire `/usr/local/bin` et `/usr/bin`. **pip** est un remplaçant d’easy_install permettant — ô miracle — de désinstaller un paquet Python. pip coopère avec les _virtualenvs_. pip apporte une fonctionnalité intéressante : le fichier `requirements.txt` qu’on peut générer avec la commande `pip freeze`. Ce fichier contient la liste à plat de tous les projets à installer pour exécuter une application, en figeant la version de chaque projet. Cela facilite la création d’environnement reproductible avec `pip`. pip n’a jamais adopté le format `.egg` d’easy_install, et execute systématiquement `setup.py install`. C’est long, provoque des erreurs. Certains `setup.py` sont compliqués, avec des dépendances pour le `setup.py` lui‑même. Mais comment dire à pip que pour exécuter `setup.py`, il faut telle version de _setuptools_ voire [pbr](https://docs.openstack.org/pbr/latest/) ou plus ? Arrive **wheel**, un format d’archive pure : on ne fait qu’extraire des fichiers de métadonnées ou du projet, sans exécuter quoi que ce soit, pas même un _postinst_. wheel est un format binaire, on peut générer un livrable wheel pour différents systèmes d’exploitation et architectures matérielles. Chaque projet se retrouve avec une ribambelle de fichiers qui s’allonge avec le temps : `setup.py`, `MANIFEST.in`, `setup.cfg`, `requirements.txt`, `requirements-dev.txt`, `requirements.in`, `.python‑version`, etc. sans compter les `tox.ini`, `flake8.cfg` et les incontournables `README`, `AUTHORS`, `LICENSE`, etc. Le très controversé [Kenneth Reitz](https://www.kennethreitz.org/) propose **Pipenv**. Il s’agit d’un outil supplémentaire pour combiner _virtualenv_, pip et pip‑tools de manière opaque. Avec ce projet, on ajoute deux fichiers `Pipfile` et `Pipfile.lock` maintenus essentiellement par la commande `pipenv`. Kenneth arrive même à [faire croire que Pipenv est le remplaçant officiel de pip](https://www.reddit.com/r/Python/comments/bkvg0s/why_pipenv_is_recommended_by_pypa/). À l’instar de `package.json` ou `cargo.toml`, la _Python Package Authority_ (PyPA) ajout un nouveau fichier : `pyproject.toml`. Le but de ce fichier est de décrire les dépendances d’installation d’un projet. Par défaut, `pip` considère que c’est _setuptools_. De là, plusieurs alternatives sont nées : [hatch](https://github.com/ofek/hatch) et Poetry. # Ce qu’apporte Poetry dans l’univers Python Dernier de la bande, Poetry permet d’étendre `pyproject.toml` pour en faire l’équivalent de `package.json`, `cargo.toml`, etc. Poetry ajoute un fichier `poetry.lock` et remplace effectivement les fichiers `setup.py`, `setup.cfg`, `MANIFEST.in`, `requirements.txt` et `requirements-dev.txt`. On peut éventuellement se passer de `tox.ini` également. Poetry remplace aussi les commandes `virtualenv`, `twine`, `wheel` et `pip-tools`. Le cœur de Poetry est un moteur de résolution de dépendances très pointu qui permet de trouver la meilleure solution pour satisfaire des contraintes parfois très complexes. pip fait un choix pragmatique et ne garantit pas de trouver l’ensemble de versions compatibles. Mieux vaut s’assurer qu’un déploiement est correct grâce à `pip check`. Poetry permet de fournir à `pip` un `requirements.txt` fiable que pip n’aura qu’à appliquer consciencieusement. # Poetry propose un ensemble de fonctionnalités complet et clair Avant de vous noyer dans la documentation, voici un aperçu de ce que Poetry permet de faire : - `poetry init` initialise un projet en posant quelques questions sur les métadonnées fondamentales ; - `poetry install` initialise un _virtualenv_ et y installe le projet et ses dépendances ; - `poetry add` et `poetry remove` permettent d’ajouter ou retirer des dépendances d’exécution ou de développement ; - `poetry shell` et `poetry run` exécutent du code dans le _virtualenv_ du projet ; - `poetry env` permet de basculer d’une version de Python à l’autre ; - `poetry version` incrémente la version de votre projet selon la spécification [SemVer](https://semver.org/lang/fr/) ; - `poetry build` et `poetry publish` génère et téléverse les livrables d’un projet ; - `poetry export` génère un fichier `requirements.txt` pour alimenter `pip` ; - `poetry update` met à jour l’ensemble des dépendances en garantissant la compatibilité et en ajoutant les nouvelles sous‑dépendances. # Un projet qui a de l’avenir La 1.0.0 est une version attendue avec, bien sûr, des compromis sur l’étendue des fonctionnalités. Néanmoins, beaucoup de projets peuvent désormais l’intégrer dans leurs chaînes de production. L’ambition de Poetry est de répondre de manière unifiée au processus de gestion d’un projet Python depuis l’initialisation jusqu’à l’installation en production. Une étape importante pour son avenir sera l’intégration d’un système de greffons pour étendre Poetry lui‑même. La popularité de Poetry explose en ce moment. Le projet est passé de 4 000 à 8 000 étoiles sur GitHub. Sur [PyPI Stats](https://pypistats.org/packages/poetry), Poetry dépasse la barre des 10 000 téléchargements quotidiens hors miroirs. Deux ingrédients peuvent expliquer ce succès : une vision claire et complète du projet portée par Sébastien Eustace et un projet technique et communautaire porté humblement, sans problèmes d’égos. Poetry est disponible et intégré dans de plus en plus de projets ou services comme CircleCI ou [DepHell](https://github.com/dephell/dephell). Poetry a certainement encore des erreurs de jeunesse : des cas d’usage non gérés, un manque de finition pour certains comportements, des erreurs ou des lenteurs. Néanmoins, l’efficacité d’un `pyproject.toml` et un `README` simple pour les collègues valent le détour. En attendant, ne boudons pas notre plaisir ! C’est le moment d’utiliser Poetry pour gérer des petits projets et se faire la main sur un outil prometteur et déjà très agréable à utiliser !