Skip to content
Snippets Groups Projects
Commit 628e194e authored by Françoise Conil's avatar Françoise Conil
Browse files

Ajout de statistiques sur les backends

Statistiques sur le code et statistiques extraites de PyPI
parent 912dd90c
No related branches found
No related tags found
No related merge requests found
images/commits_by_year_flit.png

3.44 KiB

images/commits_by_year_hatch.png

2.81 KiB

images/commits_by_year_pdm.png

3.14 KiB

images/commits_by_year_poetry.png

3.06 KiB

images/commits_by_year_setuptools.png

4.23 KiB

images/python-backends-2018-2023-log-scale.r.png

216 KiB

images/python-backends-2018-2023.r.png

217 KiB

......@@ -981,15 +981,34 @@ utiliser.
> for packaging. `Flit` can generate a configuration file to quickly set up a
> simple project, build source distributions and wheels, and upload them to `PyPI`.
`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,
sans intégration de JavaScript, ...
`Flit` est un outil récent ^[Cependant c'est un outil créé avant les
[PEP 517](https://peps.python.org/pep-0517/),
[PEP 621](https://peps.python.org/pep-0621/) et
[PEP 660](https://peps.python.org/pep-0660/), cf
[issue 522](https://github.com/pypa/flit/issues/522)] et simple pour générer
des packages pur Python : sans compilation de code C, sans intégration de
JavaScript, ...
`Flit` ne gère pas les dépendances.
`Flit` ne gère pas les environnements virtuels.
`Flit` dépendrait d'un seul développeur ?
`Flit` ne veut pas gérer d'identifiant de version dynamique à partir des `tags
git` ^[[RFE: functionality to set __version__ from scm automatically](https://github.com/pypa/flit/issues/257)]
`Flit` a un contributeur majeur (cf "Statistiques sur le code")
::: {.notes}
À surveiller :
- 540 [Document what flit_core includes in a sdist](https://github.com/pypa/flit/issues/540)
- 522 [Discussion: future shape of the 'flit' command](https://github.com/pypa/flit/issues/522)
Flit came about in a very different world, before various standards defined
how packaging tools should work together (in particular, PEPs 517, 621 and
660). A lot of design decisions I took back then don't really fit with the
world we have now, and I don't have a strong sense of how they should be
reconciled. So, let's have a discussion.
:::
## backend : Flit 2/3
......@@ -1090,9 +1109,9 @@ mis en avant par la [Python Packaging Authority](https://www.pypa.io/) dans sa d
[Poetry](https://python-poetry.org/) et <br/>
[Pipenv](https://pipenv.pypa.io/en/latest/) ^[Par contre, `Pipenv` ne génère pas de packages Python]
Je n'ai pas vu comment `Hatch` gérait les dépendances.
`Hatch` ne gère pas les dépendances.
`Hatch` dépendrait d'un seul développeur ?
`Hatch` a un contributeur majeur (cf "Statistiques sur le code")
## backend : Hatch 2/2
......@@ -1292,7 +1311,7 @@ comme **backend de build**.
`Poetry` est un outil apprécié par la communauté.
Créé avec les [PEP 518](https://peps.python.org/pep-0518/) et
Créé avant les [PEP 518](https://peps.python.org/pep-0518/) et
[PEP 621](https://peps.python.org/pep-0621/), il n'était pas en conformité avec
ces nouveaux standards. Et maintenant ?
......@@ -1302,8 +1321,6 @@ ces nouveaux standards. Et maintenant ?
`Poetry` n'est pas un projet de la [Python Packaging Authority](https://www.pypa.io/).
`Poetry` dépendrait d'un seul développeur ?
## backend : PDM
[PDM](https://pdm-project.org/) est mis en avant ^[[pyOpenSci Packaging
......@@ -1314,9 +1331,9 @@ and is funded by the [Sloan Foundation](https://sloan.org/)] pour le peer review
Open Science.
En fait, `PDM` est à la fois un **frontend** et un **backend** ce qui était le
cas de `setuptools` et peut prêter à confusion ^[[My User Experience Porting Off
cas de `setuptools` et pourrait prêter à confusion ^[[My User Experience Porting Off
setup.py](https://discuss.python.org/t/user-experience-with-porting-off-setup-py/37502/66)
sur [discuss.python.org](https://discuss.python.org/)].
sur [discuss.python.org](https://discuss.python.org/) ... mais c'est aussi le cas de `Flit` et `Hatch`].
Le projet semble très actif 2500 commits avec beaucoup de contributeurs.
Cependant 1789 commits / 2500 sont faits par [un unique contributeur](https://github.com/frostming).
......@@ -1331,6 +1348,21 @@ permettant un fonctionnement proche de [npm](https://docs.npmjs.com/about-npm).
Est-il raisonnable d'adopter un usage sur une spécification rejetée ?
:::
## frontend / backend : une vraie séparation ?
Un post sur le forum packaging souligne que `PDM` est à la fois un `backend` et
un `frontend` ^[[My User Experience Porting Off setup.py](https://discuss.python.org/t/user-experience-with-porting-off-setup-py/37502/66)
sur [discuss.python.org](https://discuss.python.org/)].
C'est également le cas pour `Flit`, créé avant l'élaboration des spécifications
`PEP 517`, `PEP 621`, etc
Ce qui ennuyeux c'est que `flit build` ne produise pas les mêmes packages
que `python -m build` ^[[Discussion: future shape of the 'flit' command](https://github.com/pypa/flit/issues/522)]
`Hatch` peut également se comporter en `frontend` puisqu'il propose également
une [commande `build`](https://hatch.pypa.io/latest/build/).
## Comparaison des backends
Le [Scientific Python Library Development Guide](https://learn.scientific-python.org/development/),
......@@ -1355,11 +1387,11 @@ communauté
![](images/jetbrains-python-developers-survey-2022-create-package-tool.png)
## Statistiques sur le code
## Statistiques sur le code 1/2
```{.txt}
Statistiques de commits
```{.txt}
| backend | Premier commit | dernier commit | nb commits | nb commit | nb authors |
| | | | | per active day | |
| ---------- | -------------- | -------------- | ---------- | -------------- | ---------- |
......@@ -1367,25 +1399,89 @@ Statistiques de commits
| Hatch | 2021-12-29 | 2023-11-13 | 669 | 2.8 | 42 |
| setuptools | 1998-12-18 | 2023-11-15 | 14175 | 4.5 | 603 |
| PDM | 2019-12-27 | 2023-10-16 | 2501 | 3.4 | 154 |
```
| Poetry | 2018-02-20 | 2023-11-21 | 3017 | 3.0 | 510 |
Principaux contributeurs
```{.txt}
| Flit | Hatch | setuptools | PDM |
| ----------------------- | ----------------------------- | ------------------------ | ------------------------ |
| auteur 1 : 879 (74.62%) | auteur 1 : 590 (88.19%) | auteur 1 : 6094 (42.99%) | auteur 1 : 1916 (76.61%) |
| auteur 2 : 46 (3.90%) | auteur 2 (bot) : 12 (1.79%) | auteur 2 : 1423 (10.04%) | idem : 175 (7.00%) |
| auteur 3 : 26 (2.21%) | auteur 3 : 12 (1.79%) | auteur 3 : 632 (4.46%) | auteur 3 : 53 (2.12%) |
632 (4.46%)
| Flit | Hatch | setuptools | PDM | Poetry |
| ---------------- | ---------------------- | ----------------- | -------------------- | ----------------- |
| 1 : 879 (74.62%) | 1 : 590 (88.19%) | 1 : 6094 (42.99%) | 1 : 1916 (76.61%) | 1 : 1049 (34.77%) |
| 2 : 46 (3.90%) | 2 (bot) : 12 (1.79%) | 2 : 1423 (10.04%) | idem : 175 (7.00%) | 2 : 346 (11.47%) |
| 3 : 26 (2.21%) | 3 : 12 (1.79%) | 3 : 632 (4.46%) | 3 : 53 (2.12%) | 3 : 162 (5.37%) |
Date de leur dernier commit
| Flit | Hatch | setuptools | PDM | Poetry |
| -------------- | -------------------- | -------------- | ----------------- | -------------- |
| 1 : 2023-11-08 | 1 : 2023-11-13 | 1 : 2023-10-08 | 1 : 2023-11-13 | 1 : 2022-09-18 |
| 2 : 2023-11-10 | 2 (bot) : 2023-10-08 | 2 : 2023-10-16 | idem : 2020-09-04 | 2 : 2022-06-10 |
| 3 : 2021-03-01 | 3 : 2023-04-02 | 3 : 2001-08-23 | 3 : 2021-05-05 | 3 : 2023-11-19 |
```
::: aside
- Données gitstats sur les dépôts le 2023-11-15
- TODO : Ajouter Poetry
- Poetry ajouté le 2023-11-22
:::
## Statistiques sur le code 2/2
:::: {.columns}
::: {.column width="50%"}
Flit
![](images/commits_by_year_flit.png){title="Flit" height="140"}
Hatch
![](images/commits_by_year_hatch.png){title="Hatch" height="140"}
setuptools
![](images/commits_by_year_setuptools.png){title="setuptools" height="140"}
:::
::: {.column width="50%"}
PDM
![](images/commits_by_year_pdm.png){title="PDM" height="140"}
Poetry
![](images/commits_by_year_poetry.png){title="Poetry" height="140"}
:::
::::
::: {.notes}
https://quarto.org/docs/authoring/figures.html#figure-panels
layout-ncol=2 layout-nrow=3
![](images/commits_by_year_flit.png){title="Flit" height="120"}
![](images/commits_by_year_pdm.png){title="PDM" height="120"}
![](images/commits_by_year_hatch.png){title="Hatch" height="120"}
![](images/commits_by_year_poetry.png){title="Poetry" height="120"}
![](images/commits_by_year_setuptools.png){title="setuptools" height="120"}
:::
## Statistiques PyPI 1/2
Extraire les backends utilisés dans le fichier `pyproject.toml` grâce aux
indications et au script proposés dans l'article
[Querying every file in every release on the Python Package Index](https://sethmlarson.dev/security-developer-in-residence-weekly-report-18)
![](images/python-backends-2018-2023.r.png)
## Statistiques PyPI - log scale 2/2
![](images/python-backends-2018-2023-log-scale.r.png)
# Librairies de gestion de l'identifiant de version
Il existe des librairies qui récupèrent le **tag** pour le définir
......@@ -1586,7 +1682,7 @@ Si des packages ont été manuellement installés dans l'environnement et qu'ils
ne sont pas présents dans le fichier `requirements.txt`, ils seront désinstallés.
:::
## Doit-on committer son requirements.txt ?
## Gestion des dépendances : committer requirements.txt ?
La question est posée dans une [issue pip-tools 1838](https://github.com/jazzband/pip-tools/issues/1838)
......@@ -1594,6 +1690,9 @@ Il est certains que si les utilisateurs d'un projet ont des environnements
différents, un seul requirements.txt (ou xxx.lock) ne peut pas être appliqué
pour tous.
::: {.notes}
J'avais trouvé une pratique intéressante mais je ne sais plus où :/
:::
## Workflow de tag 1/2
......@@ -1611,15 +1710,82 @@ Avec ces plugin de récupération de tag dans `git`, quel est le bon workflow à
À quel moment faut-il taguer dans le processus de publication de package ?
:::
## Template de projet 1/3
## Template de projet 1/4
Le [Scientific Python Library Development Guide](https://learn.scientific-python.org/development/),
propose des templates de projet très riches à utiliser au choix avec [copier](https://copier.readthedocs.io/en/stable/),
[cookiecutter](https://cookiecutter.readthedocs.io/) ou [cruft](https://cruft.github.io/cruft/).
[cookiecutter](https://cookiecutter.readthedocs.io/) ou [cruft](https://cruft.github.io/cruft/).
Exemple avec `cookiecutter` :
```{.bash code-line-numbers="1,13,19,26"}
$ cookiecutter gh:scientific-python/cookie
[1/9] The name of your project (package): my_scientific_package
[2/9] The name of your (GitHub?) org (org): fconil
[3/9] The url to your GitHub or GitLab repository (https://github.com/fconil/my_scientific_package):
[4/9] Your name (My Name): Françoise CONIL
[5/9] Your email (me@email.com): fcodvpt@gmail.com
[6/9] A short description of your project (A great package.): Testing the scientific templates for different backends
[7/9] Select a license
1 - BSD
2 - Apache
3 - MIT
Choose from [1/2/3] (1):
[8/9] Choose a build backend
1 - Hatchling - Pure Python (recommended)
2 - Flit-core - Pure Python (minimal)
3 - PDM-backend - Pure Python
4 - Whey - Pure Python
5 - Poetry - Pure Python
6 - Setuptools with pyproject.toml - Pure Python
7 - Setuptools with setup.py - Pure Python
8 - Setuptools and pybind11 - Compiled C++
9 - Scikit-build-core - Compiled C++ (recommended)
10 - Meson-python - Compiled C++ (also good)
11 - Maturin - Compiled Rust (recommended)
Choose from [1/2/3/4/5/6/7/8/9/10/11] (1): 6
[9/9] Use version control for versioning [y/n] (y):
```
J'ai fait un test avec `cookiecutter`, avec un template qui utilise
[setuptools_scm](https://setuptools-scm.readthedocs.io/). Le `pyproject.toml`
référence un fichier `_version.py`
## Template de projet 2/4
Contenu du projet généré ^[Voir les [templates Scientific-Python Development Guide](https://github.com/scientific-python/cookie) et leur utilisation] :
```{.bash}
└── my_scientific_package
├── docs
│ ├── conf.py
│ └── index.md
├── .git_archival.txt
├── .gitattributes
├── .github
│ ├── CONTRIBUTING.md
│ ├── dependabot.yml
│ ├── matchers
│ │ └── pylint.json
│ └── workflows
│ ├── cd.yml
│ └── ci.yml
├── .gitignore
├── LICENSE
├── noxfile.py
├── .pre-commit-config.yaml
├── pyproject.toml
├── README.md
├── .readthedocs.yml
├── src
│ └── my_scientific_package
│ ├── __init__.py
│ ├── py.typed
│ └── _version.pyi
└── tests
└── test_package.py
```
## Template de projet 3/4
Ayant demandé d'utiliser les informations du gestionnaire de version pour
l'identifiant de version. Le template utilise [setuptools_scm](https://setuptools-scm.readthedocs.io/).
Le `pyproject.toml` référence un fichier `_version.py`
```{.toml}
[tool.setuptools_scm]
......@@ -1628,7 +1794,7 @@ write_to = "src/example/_version.py"
ignoré par le `.gitignore` du template
```{.git}
```{.txt}
# setuptools_scm
src/*/_version.py
```
......@@ -1648,9 +1814,9 @@ ce seraient des `stub files` pour les controleurs de types statiques : [stub fil
[stub files dans la mypy](https://mypy.readthedocs.io/en/stable/stubs.html)
:::
## Template de projet 2/3
## Template de projet 4/4
Le fichier généré `src/example/_version.py`
`setuptools_scm` génère `src/example/_version.py` au build.
```{.python}
# file generated by setuptools_scm
......@@ -1671,34 +1837,423 @@ __version__ = version = '0.0.1'
__version_tuple__ = version_tuple = (0, 0, 1)
```
Il n'est pas géré par `git`, et les packages ont bien le tag
les packages ont bien l'identifiant de version correspondant au tag
```{.bash}
```{.bash code-line-numbers="1,3,9"}
$ git tag -l -n
0.0.1 Initial release
$ git status
Sur la branche main
Fichiers non suivis:
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
.pre-commit-config.yaml
$ ls dist/
example-0.0.1-py3-none-any.whl example-0.0.1.tar.gz
```
::: {.notes}
Projet généré et testé dans `/tmp`, donc à recommencer si on veut garder une trace.
C'est trop cool et cela amène plein de connaissances et des idées de bonnes
pratiques !
:::
## Template de projet 3/3
## Différences de génération de packages entre backends : wheel
C'est trop cool et cela amène plein de connaissances et des idées de bonnes
pratiques !
:::: {.columns}
Mettre la génération avec `cookiecutter`.
::: {.column width="50%"}
Flit
```{.bash code-line-numbers="7"}
├── my_scientific_package
│ ├── __init__.py
│ ├── py.typed
│ ├── _version.py
│ └── _version.pyi
├── my_scientific_package-0.0.2.dist-info
│ ├── LICENSE
│ ├── METADATA (*)
│ ├── RECORD (*)
│ └── WHEEL (*)
```
## towncrier pour créer des changelogs
setuptools
```{.bash code-line-numbers="7,10"}
├── my_scientific_package
│ ├── __init__.py
│ ├── py.typed
│ ├── _version.py
│ └── _version.pyi
├── my_scientific_package-0.0.2.dist-info
│ ├── LICENSE
│ ├── METADATA (*)
│ ├── RECORD (*)
│ ├── top_level.txt
│ └── WHEEL (*)
```
:::
::: {.column width="50%"}
Hatch
```{.bash code-line-numbers="7-8"}
├── my_scientific_package
│ ├── __init__.py
│ ├── py.typed
│ ├── _version.py
│ └── _version.pyi
├── my_scientific_package-0.0.2.dist-info
│ ├── licenses
│ │ └── LICENSE
│ ├── METADATA (*)
│ ├── RECORD (*)
│ └── WHEEL (*)
```
::: {.callout-note title="(*)"}
Différences dues :
- à des hash (RECORD),
- à la présence du nom backend utilisé (WHEEL)
- à l'ordre des lignes (METADATA) à vérifier cependant. Hath et setuptools
incluent le texte de la licence.
:::
:::
::::
::: aside
Sur la base de projets générés avec [cookiecutter](https://cookiecutter.readthedocs.io) et les
[templates Scientific-Python Development Guide](https://github.com/scientific-python/cookie)
:::
## Différences de génération de packages entre backends : sdist 1/2
:::: {.columns}
Packages générés par `python -m build` ^[[Document what flit_core includes in a sdist](https://github.com/pypa/flit/issues/540)].
::: {.column width="50%"}
Flit
```{.bash code-line-numbers="1-11"}
├── my_scientific_package-0.0.2
│ ├── LICENSE
│ ├── PKG-INFO
│ ├── pyproject.toml
│ ├── README.md
│ └── src
│ └── my_scientific_package
│ ├── __init__.py
│ ├── py.typed
│ ├── _version.py
│ └── _version.pyi
```
:::
::: {.column width="50%"}
Hatch
```{.bash code-line-numbers="2-15,17,19,22,29,30"}
├── my_scientific_package-0.0.2
│ ├── docs
│ │ ├── conf.py
│ │ └── index.md
│ ├── .git_archival.txt
│ ├── .gitattributes
│ ├── .github
│ │ ├── CONTRIBUTING.md
│ │ ├── dependabot.yml
│ │ ├── matchers
│ │ │ └── pylint.json
│ │ └── workflows
│ │ ├── cd.yml
│ │ └── ci.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── noxfile.py
│ ├── PKG-INFO
│ ├── .pre-commit-config.yaml
│ ├── pyproject.toml
│ ├── README.md
│ ├── .readthedocs.yml
│ ├── src
│ │ └── my_scientific_package
│ │ ├── __init__.py
│ │ ├── py.typed
│ │ ├── _version.py
│ │ └── _version.pyi
│ └── tests
│ └── test_package.py
```
:::
::::
::: {.notes}
Ce qui est identique entre Flit et Hatch : code-line-numbers="1,16,18,20,21,23-28"
:::
## Différences de génération de packages entre backends : sdist 2/2
:::: {.columns}
Packages générés par `python -m build`.
::: {.column width="50%"}
setuptools
```{.bash code-line-numbers="23,30-35"}
├── my_scientific_package-0.0.2
│ ├── docs
│ │ ├── conf.py
│ │ └── index.md
│ ├── .git_archival.txt
│ ├── .gitattributes
│ ├── .github
│ │ ├── CONTRIBUTING.md
│ │ ├── dependabot.yml
│ │ ├── matchers
│ │ │ └── pylint.json
│ │ └── workflows
│ │ ├── cd.yml
│ │ └── ci.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── noxfile.py
│ ├── PKG-INFO
│ ├── .pre-commit-config.yaml
│ ├── pyproject.toml
│ ├── README.md
│ ├── .readthedocs.yml
│ ├── setup.cfg
│ ├── src
│ │ ├── my_scientific_package
│ │ │ ├── __init__.py
│ │ │ ├── py.typed
│ │ │ ├── _version.py
│ │ │ └── _version.pyi
│ │ └── my_scientific_package.egg-info
│ │ ├── dependency_links.txt
│ │ ├── PKG-INFO
│ │ ├── requires.txt
│ │ ├── SOURCES.txt
│ │ └── top_level.txt
│ └── tests
│ └── test_package.py
```
:::
::: {.column width="50%"}
Hatch
```{.bash code-line-numbers="1-30"}
├── my_scientific_package-0.0.2
│ ├── docs
│ │ ├── conf.py
│ │ └── index.md
│ ├── .git_archival.txt
│ ├── .gitattributes
│ ├── .github
│ │ ├── CONTRIBUTING.md
│ │ ├── dependabot.yml
│ │ ├── matchers
│ │ │ └── pylint.json
│ │ └── workflows
│ │ ├── cd.yml
│ │ └── ci.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── noxfile.py
│ ├── PKG-INFO
│ ├── .pre-commit-config.yaml
│ ├── pyproject.toml
│ ├── README.md
│ ├── .readthedocs.yml
│ ├── src
│ │ └── my_scientific_package
│ │ ├── __init__.py
│ │ ├── py.typed
│ │ ├── _version.py
│ │ └── _version.pyi
│ └── tests
│ └── test_package.py
```
:::
::::
## Différences de génération entre flit frontend et build: sdist
:::: {.columns}
::: {.column width="50%"}
`sdist` généré par `python -m build`.
```{.bash}
├── my_project-0.0.1
│ ├── LICENSE
│ ├── PKG-INFO
│ ├── pyproject.toml
│ ├── README.md
│ └── src
│ └── my_project
│ └── __init__.py
```
:::
::: {.column width="50%"}
`sdist` généré par `flit build`.
```{.bash code-line-numbers="2-5,13-14"}
├── my_project-0.0.1
│ ├── docs
│ │ ├── conf.py
│ │ └── index.rst
│ ├── .gitignore
│ ├── LICENSE
│ ├── PKG-INFO
│ ├── pyproject.toml
│ ├── README.md
│ ├── src
│ │ └── my_project
│ │ └── __init__.py
│ └── tests
│ └── test_package.py
```
:::
::::
:::: {.columns}
::: {.column width="50%"}
```{.bash code-line-numbers="1-2"}
$ python -m build
* Creating venv isolated environment...
* Installing packages in isolated environment... (flit_core >=3.2,<4)
* Getting build dependencies for sdist...
* Building sdist...
* Building wheel from sdist
* Creating venv isolated environment...
* Installing packages in isolated environment... (flit_core >=3.2,<4)
* Getting build dependencies for wheel...
* Building wheel...
Successfully built my_project-0.0.1.tar.gz and my_project-0.0.1-py3-none-any.whl
```
:::
::: {.column width="50%"}
```{.bash code-line-numbers="1-2"}
$ flit build
Found 8 files tracked in git I-flit.sdist
Built sdist: dist/my_project-0.0.1.tar.gz I-flit_core.sdist
Copying package file(s) from /tmp/tmpwbdpows6/my_project-0.0.1/src/my_project I-flit_core.wheel
Writing metadata files I-flit_core.wheel
Writing the record of files I-flit_core.wheel
Built wheel: dist/my_project-0.0.1-py3-none-any.whl I-flit_core.wheel
```
Génération sur [ce squelette](https://gitlab.liris.cnrs.fr/fconil-small-programs/python/project-templates/flit-skeleton/-/tree/0.0.1) de projet.
:::
::::
## Différences de génération entre hatch frontend et build 1/2
:::: {.columns}
Aucune différence entre le `sdist` généré par `python -m build` et le `sdist`
généré par `hatch build`.
::: {.column width="50%"}
```{.bash}
├── my_project-0.0.1
│ ├── docs
│ │ ├── conf.py
│ │ └── index.rst
│ ├── .gitignore
│ ├── LICENSE
│ ├── PKG-INFO
│ ├── pyproject.toml
│ ├── README.md
│ ├── src
│ │ └── my_project
│ │ └── __init__.py
│ └── tests
│ └── test_package.py
```
:::
::: {.column width="50%"}
```{.bash}
├── my_project-0.0.1
│ ├── docs
│ │ ├── conf.py
│ │ └── index.rst
│ ├── .gitignore
│ ├── LICENSE
│ ├── PKG-INFO
│ ├── pyproject.toml
│ ├── README.md
│ ├── src
│ │ └── my_project
│ │ └── __init__.py
│ └── tests
│ └── test_package.py
```
:::
::::
:::: {.columns}
::: {.column width="50%"}
```{.bash code-line-numbers="1-2"}
$ python -m build
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (hatchling)
* Getting build dependencies for sdist...
* Building sdist...
* Building wheel from sdist
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (hatchling)
* Getting build dependencies for wheel...
* Building wheel...
Successfully built my_project-0.0.1.tar.gz and my_project-0.0.1-py3-none-any.whl
```
:::
::: {.column width="50%"}
```{.bash code-line-numbers="1-3"}
$ hatch build
[sdist]
dist/my_project-0.0.1.tar.gz
[wheel]
dist/my_project-0.0.1-py3-none-any.whl
```
:::
::::
## Différences de génération entre hatch frontend et build 2/2
`hatch build` affiche message transitoirement sur une ligne `... building environment`.
Si on déplace les packages qui ont été générés dans `dist`, et que l'on exécute
`hatch build` à nouveau cette ligne n'est plus affichée comme si
l'environnement était encore actif quelque part et avait une trace du type
"rien n'a changé" (les fichiers sont regénérés à l'identique).
On ne sait pas où cette information et ces données sont stockées.
## changelogs : towncrier
[towncrier](https://towncrier.readthedocs.io/en/stable/index.html) semble
servir à créer des `changelogs`.
......@@ -1707,3 +2262,7 @@ servir à créer des `changelogs`.
Used by Twisted, pytest, pip, BuildBot, and attrs, among others.
:::
## Dépôt GitHub de fichiers `.gitignore`
[.gitignore Python](https://github.com/github/gitignore/blob/main/Python.gitignore)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment