class: center, middle # Gestion de ses dépendances ## [Arthur Vuillard](mailto:arthur@hashbang.fr) Pytong 2015 --- # Quel est le problème ? - vous ne réinventez pas la roue et utilisez des librairies et des frameworks - vous ne voulez pas travailler sur Django 1.3 en 2015 - vous travaillez en équipe --- # Retour en 2012 ```bash (venv) $ pip install django (venv) $ pip freeze > requirements.txt (venv) $ cat requirements.txt django==1.3.2 (venv) $ git ci -am "add django as a requirement" ``` --- # Quelques années plus tard ```bash $ cat requirements.txt django==1.3.2 ``` --- # .center[...] --- # Les numéros de versions ## [PEP 440 (statut : accepté)](https://www.python.org/dev/peps/pep-0440/) .center[```[N!]N(.N)*[{a|b|rc}N][.postN][.devN]```] - 0.9 < 0.10 < 1.0 < 1.1 - 0.9.9 < 0.9.10 < 0.9.11 < 1.0.0 < 1.0.1 - 0.1.dev0 1.0a1 1.0b1 1.0rc1 1.0 - 2015.5.5 2015.8.0 --- # Les numéros de versions ## [Semantic Versioning (semver)](http://semver.org) .center[```X.Y.Z```] - X == 0 alors API unstable - X != 0 ; Z change == correction de bug, de vulnérabilité - X != 0 ; Y change == changement d'API compatibilité antérieure - X != 0 ; X change == changement d'API avec incompatibilité --- # Les numéros de versions ## Recommandations - constance dans le nombre de composants - semver pour les briques publiques - X.Y pour les briques privées --- # Les numéros de versions ## Don't - [TeX](https://en.wikipedia.org/wiki/TeX) - [changer de schéma de versioning à la légère](https://github.com/naparuba/shinken/issues/1679) --- # La gestion simple - setup.py - ```install_requires``` - ```extras_require``` - ```tests_require``` - ```setup_requires``` - attention à l'incohérence des pluriels ! - ```pip install --upgrade mon_projet``` - ne fixez pas de versions - borner est autorisé - seulement les dépendances directes ! --- # La gestion simple Pas idéal pour tout le monde - reproductibilité à l'identique - unification des versions au sein d'une équipe - différences prod/dév --- # Gestion avancée : [pip-tools](https://github.com/nvie/pip-tools) - ajouter un fichier requirements.in - lancer régulièrement pip-compile - lancer régulièrement pip-sync - [DRY requirements.in/setup.py](http://twidi.github.io/django-packaging-talk/#39) --- # Gestion avancée : [requires.io](https://requires.io/) - service saas de vérification - outdated - insecure - pas cher - règles customs --- # Conclusion Pour aller plus loin : - [pip-tools 1.0 released](http://nvie.com/posts/pip-tools-10-released/) (suivre les liens) - [PEP426: Metadata for Python Software Packages 2.0 (status: draft)](https://www.python.org/dev/peps/pep-0426/) - [install_requires vs Requirements files](https://packaging.python.org/en/latest/requirements/) # Des questions ? ## .center[[arthur@hashbang.fr](mailto:arthur@hashbang.fr)]