Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • fconil/presentation-versionner-un-code-python
1 result
Show changes
Commits on Source (2)
......@@ -567,18 +567,48 @@ de [PyPI](https://pypi.org/)
# PyPI
[PyPI](https://pypi.org/) est le dépôt officiel pour les packages Python
## PyPI : Présentation
[PyPI](https://pypi.org/) est le standard de fait pour le dépôt de packages
Python.
En 2022, il y a eu **35,7 milliards de téléchargements** et près de **450 000
projets** hébergés sur `PyPI` ^[[PyPI Organization: Increasing sustainability
and support](https://blog.pypi.org/posts/2023-04-23-introducing-pypi-organizations/#increasing-sustainability-and-support)],
représentant une augmentation annuelle de 57% du nombre de téléchargements et
de la bande passante.
En 2016, l'article de Donald Stufft indiquait que `PyPI` n'avait que **3
mainteneurs / administrateurs** et que l'essentiel des soutiens se faisaient
via la mise à disposition de services à titre gratuit par quelques entreprises.
En 2021, Dustin Ingram a publié un nouvel article intéressant sur la charge de
`PyPI`, sa gestion et ses soutiens ^[[What does it take to power the Python
Package Index?](https://dustingram.com/articles/2021/04/14/powering-the-python-package-index-in-2021/)].
::: {.callout-warning title="LIMITATIONS"}
On comprend alors les nécessaires limitations sur la taille des fichiers
uploadés (100 MiB) et sur la taille totale des projets sur PyPI (10 GiB) ^[On
peut demander une augmentation de la [taille des
fichiers](https://pypi.org/help/#file-size-limit) ou de la [taille totale du
projet](https://test.pypi.org/help/#project-size-limit)].
:::
## Documentation
## PyPI : Documentation et tests
Voici quelques sources d'information sur [PyPI](https://pypi.org/)
- [documentation utilisateur](https://docs.pypi.org/)
- [blog](https://blog.pypi.org/)
- [documentation admin/dev](https://warehouse.pypa.io/)
- [documentation utilisateur PyPI](https://docs.pypi.org/)
- [blog PyPI](https://blog.pypi.org/)
- [documentation admin/dev PyPI](https://warehouse.pypa.io/)
- [Python Packaging User Guide](https://packaging.python.org/)
## Authentification
### Tests
`PyPI` dispose d'une infrastructure sur laquelle on peut tester l'upload de ses
packages : [TestPyPI](https://test.pypi.org/)
## PyPI : Authentification
Afin de sécuriser le dépôt face aux packages malveillants,
[PyPI](https://pypi.org/) a mis en place l'authentification à 2 facteurs (2FA)
......@@ -600,10 +630,135 @@ Voir la documentation sur l'utilisation d'un **périphérique de sécurité** ^[
utfkey](https://pypi.org/help/#utfkey)] ou d'une **application d'authentification**
^[[Aide TOTP](https://pypi.org/help/#totp)]
## Test
## PyPI : Activation authentification 2FA
`PyPI` dispose d'une infrastructure sur laquelle on peut tester l'upload de ses
packages : [TestPyPI](https://test.pypi.org/]
![](images/pypi-2fa-activation.png){height="550"}
::: aside
Activation de l'authentification 2FA avec une application d'authentification
TOTP (FreeOTP)
:::
## PyPI : Jeton d'API
Il est fortement recommandé de s'authentifier avec un Jeton d'API ^[[Jeton
d'API](https://pypi.org/help/#apitoken) / API token] pour la publication d'un
package sur `PyPI`.
On peut définir un **jeton global** pour tous les projets de son compte PyPI
(`Paramètres du compte`) ou des jetons **dont la portée est limitée à un
projet** (`Paramètres` du projet).
On peut alors configurer l'utilisation d'un jeton dans le fichier `.pypirc`
utilisé par plusieurs outils ^[Outil de publication compte
[twine](https://twine.readthedocs.io/) ou backend comme
[Flit](https://flit.pypa.io/)] (voir la partie **backend**).
```{.ini title=".pypirc"}
[distutils]
index-servers =
pypi
testpypi
test_ntt
[test_ntt]
repository = https://test.pypi.org/legacy/
username = __token__
```
## PyPI : Trusted Publisher
La notion de [Trusted Publisher](https://docs.pypi.org/trusted-publishers/)
repose sur `OpenID Connect` pour permettre de connecter un "environnement
automatisé" de type CI ^[Continuous Integration] à `PyPI`.
:::: {.columns}
::: {.column width="60%"}
La documentation et l'interface semblent essentiellement orientées [GitHub
Action](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
^[[PyPI doc: Adding a Trusted Publisher to an Existing PyPI Project](https://docs.pypi.org/trusted-publishers/adding-a-publisher/)]
^[[PyPA doc: Publishing package distribution releases using GitHub Actions CI/CD workflows](https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows)]
::: {.callout-warning}
Je n'ai pas testé cette fonctionnalité. Lire attentivement :
- [Security model and considerations](https://docs.pypi.org/trusted-publishers/security-model/)
- [Troubleshooting](https://docs.pypi.org/trusted-publishers/troubleshooting/)
car pousser automatiquement des versions pose un certain nombre de questions. ^[[Build
and Inspect Python Packages](https://github.com/hynek/build-and-inspect-python-package)]
:::
:::
::: {.column width="40%"}
![](images/pypi-add-trusted-publisher.png){height="450"}
:::
::::
## PyPI : Personnes en charge du projet
Lorsque l'on est connecté à PyPI, il faut aller dans la gestion du projet pour
accéder au menu "Personnes" et définir les gestionnaires du projet en
saisissant l'identifiant de leur compte PyPI et leur rôle : owner (tous les
droits) ou maintainer.
### PyPI Organizations
Les organisations PyPI sont une notion récente ^[[Introducing PyPI
Organizations](https://blog.pypi.org/posts/2023-04-23-introducing-pypi-organizations/)].
Elles ont pour but :
- de faciliter l'identification de la provenance d'un package ^[[PyPI
Organization Accounts](https://docs.pypi.org/organization-accounts/)]
- de permettre aux grosses communautés (gratuit) et sociétés (pde gérer de multiples
équipes, membres, projet avec différentes permissions.
Une organisation est payante pour une société et gratuite communauté.
Une organisation ne permet pas de détenir des packages "privés" ^[[PyPI
Organization FAQ](https://docs.pypi.org/organization-accounts/org-acc-faq/)].
# Un mot sur conda
## Présentation
[conda](https://conda.io/) est l'outil de gestion de packages pour les
installations de **Python Anaconda**. Python Anaconda est une distribution
Python de la [société Anaconda](https://www.anaconda.com/) à destination de la
communauté scientifique, en particulier sous Windows où l'installation
d'extensions binaires est souvent difficile.
`conda` est un outil complètement séparé des outils `pip`, `virtualenv` et
`wheel` mais il fournit plusieurs de leurs fonctionnalités en terme de gestion
de packages, de gestion d'environnement virtuel et de déploiement d'extension
binaires.
`conda` n'installe pas de package depuis [PyPI](https://pypi.org/) et ne peut
installer des packages que depuis le dépôt officiel Anaconda, ou [anaconda.org](anaconda.org)
ou un serveur de packages local.
Cependant, `pip` peut être installé et fonctionner en parallèle de `conda` pour
installer des packages depuis `PyPI`. [conda skeleton](https://docs.conda.io/projects/conda-build/en/latest/user-guide/tutorials/build-pkgs-skeleton.html)
permet de créer des packages conda à partir de package téléchargés depuis `PyPI`
en modifiant leurs métadonnées.
::: {.notes}
Conda does not install packages from PyPI and can install only from the
official Anaconda repositories, or anaconda.org (a place for user-contributed
conda packages), or a local (e.g. intranet) package server. However, note that
pip can be installed into, and work side-by-side with conda for managing
distributions from PyPI. Also, conda skeleton is a tool to make Python packages
installable by conda by first fetching them from PyPI and modifying their
metadata.
:::
::: aside
Traduit de [Project Summaries - Non-PyPA projects](https://packaging.python.org/en/latest/key_projects/#non-pypa-projects)
:::
# Quelques backend pour le build de packages
......@@ -612,7 +767,7 @@ packages : [TestPyPI](https://test.pypi.org/]
Les backends se sont multipliés au point qu'il est difficile de savoir lequel
utiliser.
## Flit 1/3
## backend : Flit 1/3
> [Flit](https://flit.pypa.io/en/latest/) provides a simple way to create and
> upload pure Python packages and modules to `PyPI`. It focuses on [making the easy things easy](https://flit.pypa.io/en/latest/rationale.html)
......@@ -621,7 +776,7 @@ utiliser.
`Flit` est un outil récent ^[Post [PEP 518](https://peps.python.org/pep-0518/)]
et simple pour générer des packages pur Python : sans compilation de code C,
intégration de JavaScript, ...
sans intégration de JavaScript, ...
`Flit` ne gère pas les dépendances.
......@@ -629,9 +784,9 @@ intégration de JavaScript, ...
`Flit` dépendrait d'un seul développeur ?
## Flit 2/3
## backend : Flit 2/3
Exemple de fichier `pyproject.toml` généré par `Flit` :
Exemple de fichier `pyproject.toml` généré par la commande `flit init` :
```{.toml}
[build-system]
......@@ -654,19 +809,65 @@ Les métadonnées `version` et `description` sont récupérées dynamiquement :
[Flit : The pyproject.toml config file](https://flit.pypa.io/en/latest/pyproject_toml.html?highlight=dynamic#new-style-metadata)
:::
## Flit publish 3/3
## backend : Flit publish 3/3
Il est intéressant de tester l'upload de son package sur le serveur de test
On peut tester l'upload de son package sur le serveur :
[test.pypi.org](https://test.pypi.org/)
^[Voir [PyPA : Using TestPyPI](https://packaging.python.org/en/latest/guides/using-testpypi/)
et [Flit : Controlling package uploads](https://flit.pypa.io/en/latest/upload.html)]
Il est nécessaire de configurer, au préalable, l'accès au serveur
`test.pypi.org` dans le fichier `.pypirc` ^[[Flit issue 122](https://github.com/pypa/flit/issues/122)]
ce que ne requiert pas pour un upload vers [pypi.org](https://pypi.org/)
:::: {.columns}
::: {.column width="50%"}
Publication avec un `token d'API` spécifique au projet, configuré dans le
fichier `.pypirc` :
```{.ini}
[distutils]
index-servers =
pypi
testpypi
test_ntt
Flit requiert alors de configurer l'accès à ce serveur dans le fichier
`.pypirc` ^[[Flit issue 122](https://github.com/pypa/flit/issues/122)] ce qu'il
ne fait pas automatiquement contrairement aux upload vers [pypi.org](https://pypi.org/)
[test_ntt]
repository = https://test.pypi.org/legacy/
username = __token__
```
:::
::: {.column width="50%"}
```{.bash}
$ flit publish --repository test_ntt
Found 144 files tracked in git I-flit.sdist
Built sdist: dist/ntt-0.1.1.tar.gz I-flit_core.sdist
Copying package file(s) from /tmp/tmpdgzv3ozw/ntt-0.1.1/src/ntt I-flit_core.wheel
Writing metadata files I-flit_core.wheel
Writing the record of files I-flit_core.wheel
Built wheel: dist/ntt-0.1.1-py3-none-any.whl I-flit_core.wheel
Using repository at https://test.pypi.org/legacy/ I-flit.upload
Install keyring to store passwords securely W-flit.upload
Server : https://test.pypi.org/legacy/
Username: __token__
Password:
Uploading dist/ntt-0.1.1-py3-none-any.whl... I-flit.upload
Package is at https://test.pypi.org/project/ntt/ I-flit.upload
...
Uploading dist/ntt-0.1.1.tar.gz... I-flit.upload
...
```
:::
- [PyPA : Using TestPyPI](https://packaging.python.org/en/latest/guides/using-testpypi/)
- [Flit : Controlling package uploads](https://flit.pypa.io/en/latest/upload.html)
::::
## Hatch 1/2
## backend : Hatch 1/2
> [Hatch](https://hatch.pypa.io/latest/) is a unified command-line tool meant
> to conveniently **manage dependencies** and **environment isolation** for
......@@ -686,7 +887,7 @@ Je n'ai pas vu comment `Hatch` gérait les dépendances.
`Hatch` dépendrait d'un seul développeur ?
## Hatch 2/2
## backend : Hatch 2/2
Le fichier `pyproject.toml` généré par `hatch new foobar` est assez conséquent
(157 lignes) :
......@@ -851,7 +1052,7 @@ exclude_lines = [
]
```
## Setuptools
## backend : Setuptools
> [Setuptools](https://setuptools.pypa.io/en/latest/index.html) is a collection
> of enhancements to the Python distutils that allow you to more easily **build
......@@ -872,7 +1073,7 @@ pour intégrer la version git au package semblent nécessiter `setuptools`
comme **backend de build**.
:::
## Poetry
## backend : Poetry
> [Poetry](https://python-poetry.org/) is a command-line tool to handle
> dependency installation and isolation as well as building and packaging of
......@@ -895,44 +1096,6 @@ ces nouveaux standards. Et maintenant ?
`Poetry` dépendrait d'un seul développeur ?
# Un mot sur conda
## Présentation
[conda](https://conda.io/) est l'outil de gestion de packages pour les
installations de **Python Anaconda**. Python Anaconda est une distribution
Python de la [société Anaconda](https://www.anaconda.com/) à destination de la
communauté scientifique, en particulier sous Windows où l'installation
d'extensions binaires est souvent difficile.
`conda` est un outil complètement séparé des outils `pip`, `virtualenv` et
`wheel` mais il fournit plusieurs de leurs fonctionnalités en terme de gestion
de packages, de gestion d'environnement virtuel et de déploiement d'extension
binaires.
`conda` n'installe pas de package depuis [PyPI](https://pypi.org/) et ne peut
installer des packages que depuis le dépôt officiel Anaconda, ou [anaconda.org](anaconda.org)
ou un serveur de packages local.
Cependant, `pip` peut être installé et fonctionner en parallèle de `conda` pour
installer des packages depuis `PyPI`. [conda skeleton](https://docs.conda.io/projects/conda-build/en/latest/user-guide/tutorials/build-pkgs-skeleton.html)
permet de créer des packages conda à partir de package téléchargés depuis `PyPI`
en modifiant leurs métadonnées.
::: {.notes}
Conda does not install packages from PyPI and can install only from the
official Anaconda repositories, or anaconda.org (a place for user-contributed
conda packages), or a local (e.g. intranet) package server. However, note that
pip can be installed into, and work side-by-side with conda for managing
distributions from PyPI. Also, conda skeleton is a tool to make Python packages
installable by conda by first fetching them from PyPI and modifying their
metadata.
:::
::: aside
Traduit de [Project Summaries - Non-PyPA projects](https://packaging.python.org/en/latest/key_projects/#non-pypa-projects)
:::
# Librairies de gestion de l'identifiant de version
Il existe des librairies qui récupèrent le **tag** pour le définir
......