Python Programming

Vaincre l'enfer des dépendances avec Poetry et Pip-Compile

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.
Share: