gwift-book/source/toolchain/venvs.adoc

7.0 KiB
Raw Blame History

Environnements virtuels

On va commencer avec la partie la moins funky, mais la plus utile, dans la vie dun développeur: la gestion et lisolation des dépendances.

Il est tout à fait possible de sen passer complètement dans le cadre de "petits" projets ou dapplications déployées sur des machines dédiées, et de fonctionner à grand renforts de "sudo" et dinstallation globale des dépendances. Cette pratique est cependant fortement déconseillée pour plusieurs raisons:

  1. Pour la reproductibilité dun environnement spécifique. Cela évite notamment les réponses type "Ca juste marche chez moi", puisquon a la possibilité de construire un environnement sain et appliquer des dépendances identiques, quelle que soit la machine hôte.

  2. Il est tout à fait envisagable que deux applications soient déployées sur un même hôte, et nécessitent chacune deux versions différentes dune même dépendance.

But it works on my machine! Then, well ship your machine.

— A famous meme
And this is how Docker was born.

Nous allons utiliser le module venv afin de créer un `environnement virtuel <http://sametmax.com/les-environnement-virtuels-python-virtualenv-et-virtualenvwrapper/>`_ pour python.

Note
auparavant, on utilisait virtualenvwrapper. mais cela fait plusieurs années que je ne lutilise plus. On lintègre quand même ?

Création de lenvironnement virtuel

Commencons par créer un environnement virtuel, afin dy stocker les dépendances. Lancez python3 -m venv gwift-env.

---
Intégrer les résultats de la création de l'environnement
---

Ceci créera larborescence de fichiers suivante, qui peut à nouveau être un peu différente en fonction du système dexploitation:

  1. code-block:: shell

    $ ls .virtualenvs/gwift-env
    bin include lib

Nous pouvons ensuite lactiver grâce à la commande source gwift-env.

---
Intégrer les résultats de l'accès de l'environnement
---

Le shell signale que nous sommes bien dans lenvironnement gwift-env en laffichant avant le $. Par la suite, nous considérerons que lenvironnement virtuel est toujours activé, même si gwift-env nest pas présent devant chaque $.

A présent, tous les binaires de cet environnement prendront le pas sur les binaires du système. De la même manière, une variable PATH propre est définie et utilisée, afin que les librairies Python y soient stockées. Cest donc dans cet environnement virtuel que nous retrouverons le code source de Django, ainsi que des librairies externes pour Python une fois que nous les aurons installées.

Pour désactiver lenvironnement virtuel, il suffira dutiliser la commande deactivate

Installation de Django et création du répertoire de travail

Comme lenvironnement est activé, on peut à présent y installer Django. La librairie restera indépendante du reste du système, et ne polluera pas les autres projets.

Cest parti: pip install django!

  1. code-block:: shell

    $ pip install django
    Collecting django
      Downloading Django-X.Y.Z
    100% |################################|
    Installing collected packages: django
    Successfully installed django-X.Y.Z

Les commandes de création dun nouveau site sont à présent disponibles, la principale étant django-admin startproject. Par la suite, nous utiliserons manage.py, qui constitue un wrapper autour de django-admin.

Pour démarrer notre projet, nous lançons donc django-admin startproject gwift.

$ django-admin startproject gwift

Cette action a pour effet de créer un nouveau dossier gwift, dans lequel on trouve la structure suivante:

$ tree gwift
gwift
├── gwift
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Cest sans ce répertoire que vont vivre tous les fichiers liés au projet. Le but est de faire en sorte que toutes les opérations (maintenance, déploiement, écriture, tests, …​) puissent se faire à partir dun seul point dentrée. Tant quon y est, nous pouvons rajouter les répertoires utiles à la gestion de notre projet, à savoir la documentation, les dépendances et le README:

$ mkdir docs requirements
$ touch docs/README.md
$ tree gwift
gwift
├── gwift
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
|-- docs/
|-- requirements/
|-- README

Chacun de ces fichiers sert à:

  • settings.py contient tous les paramètres globaux à notre projet.

  • urls.py contient les variables de routes, les adresses utilisées et les fonctions vers lesquelles elles pointent.

  • manage.py, pour toutes les commandes de gestion.

  • wsgi.py contient la définition de linterface `WSGI <https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface>`_, qui permettra à votre serveur Web (Nginx, Apache, …​) de faire un pont vers votre projet.

Note
déplacer la configuration dans un répertoire config à part.

Gestion des dépendances

Comme nous venons dajouter une dépendance à notre projet, nous allons créer un fichier reprenant tous les dépendances de notre projet. Celles-ci sont normalement placées dans un fichier requirements.txt. Dans un premier temps, ce fichier peut être placé directement à la racine du projet, mais on préférera rapidement le déplacer dans un sous-répertoire spécifique (requirements), afin de grouper les dépendances en fonction de leur utilité:

  • base.txt

  • dev.txt

  • staging.txt

  • production.txt

Au début de chaque fichier, il suffira dajouter la ligne -r base.txt, puis de lancer linstallation grâce à un pip install -r <nom du fichier>. De cette manière, il est tout à fait acceptable de ninstaller flake8 et django-debug-toolbar quen développement par exemple. Dans limmédiat, ajoutez simplement django dans le fichier requirements/base.txt.

$ echo django >> requirements/base.txt

Par la suite, il vous faudra absolument spécifier les versions à utiliser: les librairies que vous utilisez comme dépendances évoluent, de la même manière que vos projets. Des fonctions sont cassées, certaines signatures sont modifiées, des comportements sont altérés, etc. Si vous voulez être sûr et certain que le code que vous avez écrit continue à fonctionner, spécifiez la version de chaque librairie de dépendances. Avec les mécanismes dintégration continue et de tests unitaires, on verra plus loin comment se prémunir dun changement inattendu.

Structure finale de lenvironnement

Nous avons donc la strucutre finale pour notre environnement de travail:

$ tree ~/gwift-project
gwift
├── docs
│   └── README.md
├── gwift
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│   manage.py
└── requirements
    └── base.txt