Documentations versionnées avec Sphinx
Jusqu’à peu, j’utilisais mkdocs pour générer les documentations, mais suite au besoin de pouvoir proposer plusieurs versions de la même , je me suis tourné vers Sphinx.
Sphinx permet de :
- Générer différents formats de sortie: HTML, PDF, EPUB, …
- Générer automatiquement la documentation liée à du code pour de nombreux langages,
- D’étendre ses fonctionnalités avec sa gestion d’extensions.
Par défaut Sphinx les documents sont écrits en reStructuredText ↗. Comme le markdown, le reStructuredText est un langage de balisage léger utilisé notamment dans la documentation du langage Python. Je vous propose ici de mettre en place sphinx avec le support du versioning des documents.
Installer Sphinx
Il faut dans un premier temps installé python :
Ensuite, il faut lancer la commande suivante pour initialiser la structure :
Répondez juste Y à la première question pour séparer source du build.
C’est dans le répertoire source que vous allez créer vos documents.
Génération de la première version
Il suffit de lancer la commande :
Dans une autre fenêtre shell :
Ouvrer lien http://localhost:8000 ↗
Changer le thème pour celui de read the doc
Il existe de très nombreux thèmes ↗, mais ma préférence va à celui du site readthedoc. Pour l’installer il faut ajouter une extension et modifier la configuration qui est géré par le fichier conf.py.
Dans le fichier conf.py remplacer le thème par sphinx_rtd_theme
Maintenant nettoyer et re-générer le site :
Installation de sphinx-multiversions
Comme sur le site readthedoc il est possible avec sphinx de générer plusieurs versions de votre documentation. Cela se fait avec l’extension sphinx-multiversion ↗. Sphinx-multiversions utilise soit les branches, soit les tags (là va ma préférence.)
Comme pour les autres modules, il faut l’ajouter en tant que module.
Il faut modifier le fichier source/conf.py et intégrer ces différentes modifications :
- Ajouter l’extension sphinx_multiversion
- Ajouter des variables permettant d’indiquer à sphinx-multiversions quel tag ou release exploité.
Ensuite faites un commit de votre code, puis posez les tags v0.1
puis latest
et lancer la commande suivante :
Et cette fois, vous avez les versions v0.1
et latest
(identiques) qui ont
été généré dans votre répertoire build.
Ajout du menu de version
Il faut créer un template dans le répertoire source/_templates
Régénérer la documentation et vous devriez voir apparaître en bas de la sidebar le menu affichant les différentes versions de votre documentation.
Ajout d’une bannière indiquant si on consulte sur la dernière version de la documentation
Si on affiche une ancienne version de la documentation il faut pour indiquer que ce n’est pas la dernière. Pour cela on va ajouter une bannière qui ne s’affichera que s’il ne s’agit pas de la dernière version (latest ou smv_latest_version.)
Cette fois dans le répertoire source/_templates créer un fichier layout.html et y déposer ce contenu :
Ici, avec Jinja
on surcharge le block document
en lui ajoutant devant la version
du template ce panneau d’attention.
Redirection vers la dernière version de la documentation
À la source du répertoire, vous pouvez ajouter un fichier index.html redirigeant
vers la version latest
.
Ajouter le support du markdown à sphinx
La plupart de mes documentations sont écrites en markdown je vais donc ajouté le support du markdown à sphinx via une autre extension :
Dans le fichier de configuration conf.py ajouter l’extension
Il ajouter aussi le support des fichiers .md
La suite ~~~~
Il existe un nombre très important d’extensions à sphinx. Personnellement j’utilise redoc pour générer les documentations des api. J’ai donc ajouté l’extension sphinxcontrib-redoc ↗ qui ajouté à celle de multiversions permet de générer des documentations d’api versionnées intégrant un changelog.