From 3dd773d6d8d3465690b9eda284519af4e125eab5 Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Fri, 3 Sep 2021 22:03:10 +0200 Subject: [PATCH] Add poetry instructions --- source/images/xkcd-1987.png | Bin 0 -> 54078 bytes source/part-1-workspace/django/_index.adoc | 163 ++++++++++++++++++++- 2 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 source/images/xkcd-1987.png diff --git a/source/images/xkcd-1987.png b/source/images/xkcd-1987.png new file mode 100644 index 0000000000000000000000000000000000000000..4f482458d75f11abaa24bb87ce03f912998baec4 GIT binary patch literal 54078 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 z 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 XDk{W3)Cn_U00000NkvXXu0mjf*An8_ literal 0 HcmV?d00001 diff --git a/source/part-1-workspace/django/_index.adoc b/source/part-1-workspace/django/_index.adoc index 4338633..cf562fa 100644 --- a/source/part-1-workspace/django/_index.adoc +++ b/source/part-1-workspace/django/_index.adoc @@ -35,11 +35,14 @@ Dans les étapes ci-dessous, nous épinglerons une version LTS afin de nous assu ne occuperons pas pendant les 3 prochaines années). -==== Environnement virtuel +==== Environnements virtuels -Depuis la version 3.5 de Python, le module `venv` est https://docs.python.org/3/library/venv.html[la manière recommandée] pour créer un environnement virtuel. +.https://xkcd.com/1987 +image::images/xkcd-1987.png[] -NOTE: Il existe plusieurs autres modules permettant d'arriver au même résultat, avec quelques avantages et inconvénients pour chacun d'entre eux. Le plus prometteur d'entre eux est https://python-poetry.org/[Poetry], qui dispose d'une interface en ligne de commande plus propre et plus moderne que ce que PIP propose. +Un des reproches que l'on peut faire au langage concerne sa versatilité: il est possible de réaliser beaucoup de choses, mais celles-ci ne sont pas toujours simples ou directes. +Pour quelqu'un qui débarquererait, la quantité d'options différentes peut paraître rebutante. +Nous pensons notamment aux environnements virtuels: ils sont géniaux à utiliser, mais on est passé par virtualenv (l'ancêtre), virtualenvwrapper (sa version améliorée et plus ergonomique), `venv` (la version intégrée depuis la version 3.3 de l'interpréteur, et https://docs.python.org/3/library/venv.html[la manière recommandée] de créer un environnement depuis la 3.5). Pour créer un nouvel environnement, vous aurez donc besoin: @@ -47,7 +50,59 @@ Pour créer un nouvel environnement, vous aurez donc besoin: . D'un terminal - voir le point <<../environment/_index.adoc#un-terminal,Un terminal>> +NOTE: Il existe plusieurs autres modules permettant d'arriver au même résultat, avec quelques avantages et inconvénients pour chacun d'entre eux. Le plus prometteur d'entre eux est https://python-poetry.org/[Poetry], qui dispose d'une interface en ligne de commande plus propre et plus moderne que ce que PIP propose. + +Poetry se propose de gérer le projet au travers d'un fichier pyproject.toml. TOML (du nom de son géniteur, Tom Preston-Werner, légèrement CEO de GitHub à ses heures), se place comme alternative aux formats comme JSON, YAML ou INI. + +[source,bash] +---- +La commande poetry new créera une structure par défaut relativement compréhensible: + +$ poetry new django-gecko +$ tree django-gecko/ +django-gecko/ +├── django_gecko +│ └── __init__.py +├── pyproject.toml +├── README.rst +└── tests + ├── __init__.py + └── test_django_gecko.py + +2 directories, 5 files +---- + +Ceci signifie que nous avons directement (et de manière standard): + +* Un répertoire django-gecko, qui porte le nom de l'application que vous venez de créer +* Un répertoires tests, libellé selon les standards de pytest +* Un fichier README.rst (qui ne contient encore rien) +* Un fichier pyproject.toml, qui contient ceci: + +[source,toml] +---- +[tool.poetry] +name = "django-gecko" +version = "0.1.0" +description = "" +authors = ["... <...@grimbox.be>"] + +[tool.poetry.dependencies] +python = "^3.9" + +[tool.poetry.dev-dependencies] +pytest = "^5.2" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" +---- + +La commande `poetry init` permet de générer interactivement les fichiers nécessaires à son intégration dans un projet existant. + + NOTE: J'ai pour habitude de conserver mes projets dans un répertoire `~/Sources/` et mes environnements virtuels dans un répertoire `~/.venvs/`. + Cette séparation évite que l'environnement virtuel ne se trouve dans le même répertoire que les sources, ou ne soit accidentellement envoyé vers le système de gestion de versions. Elle évite également de rendre ce répertoire "visible" - il ne s'agit au fond que d'un paramètre de configuration lié uniquement à votre environnement de développement; les environnements virtuels étant disposables, il n'est pas conseillé de trop les lier au projet qui l'utilise comme base. Dans la suite de ce chapitre, je considérerai ces mêmes répertoires, mais n'hésitez pas à les modifier. @@ -95,6 +150,106 @@ Cette technique fonctionnera autant pour un poste de développement que sur les NOTE: Par la suite, nous considérerons que l'environnement virtuel est toujours activé, même si `gwift-env` n'est pas indiqué. +a manière recommandée pour la gestion des dépendances consiste à les épingler dans un fichier requirements.txt, placé à la racine du projet. Ce fichier reprend, ligne par ligne, chaque dépendance et la version nécessaire. Cet épinglage est cependant relativement basique, dans la mesure où les opérateurs disponibles sont ==, <= et >=. + +Poetry propose un épinglage basé sur SemVer. Les contraintes qui peuvent être appliquées aux dépendances sont plus touffues que ce que proposent pip -r, avec la présence du curseur ^, qui ne modifiera pas le nombre différent de zéro le plus à gauche: + + ^1.2.3 (où le nombre en question est 1) pourra proposer une mise à jour jusqu'à la version juste avant la version 2.0.0 + ^0.2.3 pourra être mise à jour jusqu'à la version juste avant 0.3.0. + ... + +L'avantage est donc que l'on spécifie une version majeure - mineure - patchée, et que l'on pourra spécifier accepter toute mise à jour jusqu'à la prochaine version majeure - mineure patchée (non incluse 😉). + +Une bonne pratique consiste également, tout comme pour npm, à intégrer le fichier de lock (poetry.lock) dans le dépôt de sources: de cette manière, seules les dépendances testées (et intégrées) seront considérées sur tous les environnements de déploiement. + +Il est alors nécessaire de passer par une action manuelle (poetry update) pour mettre à jour le fichier de verrou, et assurer une mise à jour en sécurité (seules les dépendances testées sont prises en compte) et de qualité (tous les environnements utilisent la même version d'une dépendance). + +L'ajout d'une nouvelle dépendance à un projet se réalise grâce à la commande `poetry add `: + +[source,shell] +---- +$ poetry add django +Using version ^3.2.3 for Django + +Updating dependencies +Resolving dependencies... (5.1s) + +Writing lock file + +Package operations: 8 installs, 1 update, 0 removals + + • Installing pyparsing (2.4.7) + • Installing attrs (21.2.0) + • Installing more-itertools (8.8.0) + • Installing packaging (20.9) + • Installing pluggy (0.13.1) + • Installing py (1.10.0) + • Installing wcwidth (0.2.5) + • Updating django (3.2 -> 3.2.3) + • Installing pytest (5.4.3) + +---- + +Elle est ensuite ajoutée à notre fichier `pyproject.toml`: + +[source,toml] +---- +[...] + +[tool.poetry.dependencies] +python = "^3.9" +Django = "^3.2.3" + +[...] +---- + +Et contrairement à `pip`, pas besoin de savoir s'il faut pointer vers un fichier (`-r`) ou un dépôt VCS (`-e`), puisque Poetry va tout essayer, [dans un certain ordre](https://python-poetry.org/docs/cli/#add). +L'avantage également (et cela m'arrive encore souvent, ce qui fait hurler le runner de Gitlab), c'est qu'il n'est plus nécessaire de penser à épingler la dépendance que l'on vient d'installer parmi les fichiers de requirements, puisqu'elles s'y ajoutent automatiquement grâce à la commande `add`. + +==== Python packaging made easy + +Cette partie dépasse mes compétences et connaissances, dans la mesure où je n'ai jamais rien packagé ni publié sur [pypi.org](pypi.org). +Ce n'est pas l'envie qui manque, mais les idées et la nécessité 😉. +Ceci dit, Poetry propose un ensemble de règles et une préconfiguration qui (doivent) énormément facilite(r) la mise à disposition de librairies sur Pypi - et rien que ça, devrait ouvrir une partie de l'écosystème. + +Les chapitres 7 et 8 de [Expert Python Programming - Third Edtion](#), écrit par Michal Jaworski et Tarek Ziadé en parlent très bien: + +> Python packaging can be a bit overwhelming at first. +> The main reason for that is the confusion about proper tools for creating Python packages. +> Anyway, once you create your first package, you will se that this is as hard as it looks. +> Also, knowing propre, state-of-the-art packaging helps a lot. + +En gros, c'est ardu-au-début-mais-plus-trop-après. +Et c'est heureusement suivi et documenté par la PyPA (*https://github.com/pypa[Python Packaging Authority]*). + +Les étapes sont les suivantes: + +1. Utiliser setuptools pour définir les projets et créer les distributions sources, +2. Utiliser **wheels** pour créer les paquets, +3. Passer par **twine** pour envoyer ces paquets vers PyPI +4. Définir un ensemble d'actions (voire, de plugins nécessaires - lien avec le VCS, etc.) dans le fichier `setup.py`, et définir les propriétés du projet ou de la librairie dans le fichier `setup.cfg`. + +Avec Poetry, deux commandes suffisent (théoriquement - puisque je n'ai pas essayé 🤪): `poetry build` et `poetry publish`: + +[source,shell] +---- +$ poetry build +Building geco (0.1.0) + - Building sdist + - Built geco-0.1.0.tar.gz + - Building wheel + - Built geco-0.1.0-py3-none-any.whl + +$ tree dist/ +dist/ +├── geco-0.1.0-py3-none-any.whl +└── geco-0.1.0.tar.gz + +0 directories, 2 files +---- + +Ce qui est quand même 'achement plus simple que d'appréhender tout un écosystème. + ==== Gestion des dépendances, installation de Django et création d'un nouveau projet @@ -571,4 +726,4 @@ La https://docs.djangoproject.com/en/stable/ref/django-admin/#startproject[docum [source,bash] ---- django-admin.py startproject --template=https://[...].zip ----- \ No newline at end of file +----