Le chaos des dépendances flottantes
Dans l'écosystème Python, l'expression « ça marche sur ma machine » est un symptôme notoire des échecs de gestion des dépendances. Lorsque vous vous fiez à des contraintes non versionnées comme
>=1.0, votre environnement est soumis aux caprices des mises à jour des paquets amont. Une simple mise à jour mineure d'une dépendance transitive peut introduire des modifications incompatibles, entraînant des erreurs cryptiques en production impossibles à reproduire localement. Ce phénomène, largement connu sous le nom d'« Enfer des dépendances », est la raison principale pour laquelle la reproductibilité est la pierre angulaire de l'ingénierie logicielle professionnelle.
Pour lutter contre cela, la norme de l'industrie a évolué vers les fichiers de verrouillage (lock files) — des instantanés statiques de toutes les dépendances résolues. Bien que les outils comme
pip aient longtemps manqué de support natif pour les fichiers de verrouillage, la communauté a développé des solutions robustes. Deux des outils les plus puissants pour obtenir des builds déterministes sont Poetry et pip-tools (spécifiquement
pip-compile). Ce guide explore comment utiliser ces deux outils pour créer des environnements Python reproductibles et infaillibles.
Stratégie A : L'écosystème intégré de Poetry
Poetry aborde la gestion des dépendances en la traitant comme une fonctionnalité centrale plutôt que comme une pensée après coup. Il combine la résolution des dépendances, la gestion des environnements virtuels et l'emballage (packaging) en un seul outil. Le cœur de ce système est le fichier
poetry.lock.
Lorsque vous exécutez
poetry install, Poetry n'installe pas seulement les paquets listés dans
pyproject.toml ; il lit le fichier de verrouillage pour s'assurer que chaque dépendance transitive est épinglée à un hachage de version exact. Cela garantit que l'environnement sur votre ordinateur portable est identique à celui de l'intégration continue/déploiement continu (CI/CD) et de la production.
Voici comment configurer un projet Poetry de base :
# Initialiser un nouveau projet
poetry new my-project
# Ajouter une dépendance
poetry add requests
# Cela génère poetry.lock, épinglant requests et toutes ses sous-dépendances
Pour installer les dépendances en production, utilisez toujours le fichier de verrouillage. N'exécutez jamais
poetry update dans un pipeline de production, car cela régénérerait le fichier de verrouillage avec des versions potentiellement plus récentes.
# Installation stricte à partir du fichier de verrouillage
poetry install --no-dev
L'avantage de Poetry réside dans son intégration transparente. Cependant, si vous êtes lié aux workflows standards de
pip ou si vous nécessitez une séparation stricte entre les dépendances de construction et d'exécution, l'approche tout-en-un de Poetry peut sembler trop monolithique.
Stratégie B : L'approche pip-tools
Pour les développeurs qui préfèrent la simplicité de
pip mais ont besoin de builds déterministes,
pip-tools est la solution idéale. L'outil
pip-compile prend un fichier
requirements.in (qui liste vos dépendances directes) et les résout dans un fichier
requirements.txt avec un épinglage complet des versions.
Cette méthode imite le comportement des modules Go ou de Cargo, offrant une séparation claire entre l'intention (ce que vous voulez) et l'implémentation (ce que vous obtenez).
# Créer un fichier requirements.in
echo "requests==2.28.0" > requirements.in
# Résoudre et compiler les dépendances
pip-compile requirements.in
# Cela génère un requirements.txt entièrement épinglé
Le fichier
requirements.txt généré ressemblera à ceci :
#
# Ce fichier est généré automatiquement par pip-compile avec python 3.10
# Pour mettre à jour, exécutez :
#
# pip-compile requirements.in
#
certifi==2022.12.7
charset-normalizer==2.1.1
idna==3.4
requests==2.28.0
urllib3==1.26.13
Remarquez comment
requests fait appel à des versions spécifiques de
certifi,
urllib3, etc. Ce fichier est sûr à valider (commit) dans votre dépôt et à installer en production en utilisant
pip install -r requirements.txt.
Choisir le bon outil
Les deux outils résolvent le même problème fondamental : la reproductibilité. Poetry est mieux adapté aux projets verts (greenfield) ou aux équipes qui souhaitent un flux de travail unifié pour construire et publier des paquets. Il gère automatiquement les environnements virtuels et offre une riche interface en ligne de commande (CLI) pour gérer les scripts et les plugins.
D'un autre côté, pip-tools est plus léger et s'intègre parfaitement aux Dockerfiles et aux pipelines CI/CD existants qui utilisent déjà
pip. Il est également préférable pour les projets ayant des dépendances de construction complexes (comme les extensions C) où le résolveur de Poetry struggle parfois occasionnellement.
Conclusion
L'enfer des dépendances n'est plus une excuse pour l'instabilité en production. En adoptant soit le
poetry.lock de Poetry, soit le
requirements.txt de pip-tools, vous garantissez que votre logiciel se comporte de manière cohérente dans tous les environnements. La leçon clé est simple : ne vous fiez jamais à une contrainte de version flottante. Épinez vos dépendances, faites confiance à vos fichiers de verrouillage, et dormez plus tranquille la nuit.