J’utilise pip avec virtualenv pour empaqueter et installer certaines bibliothèques Python.
J’imagine que ce que je fais est un scénario assez courant. Je suis le responsable de plusieurs bibliothèques pour lesquelles je peux spécifier les dépendances de manière explicite. Certaines de mes bibliothèques dépendent de bibliothèques tierces dotées de dépendances transitives sur lesquelles je n’ai aucun contrôle.
Ce que j’essaie de faire, c’est d’ pip install
une pip install
sur l’une de mes bibliothèques pour télécharger / installer toutes ses dépendances en amont. Ce qui me pose problème dans la documentation de pip, c’est si / comment les fichiers de spécifications peuvent le faire eux-mêmes ou s’ils ne sont que des compléments à utiliser avec install_requires
.
Dois-je utiliser install_requires
dans toutes mes bibliothèques pour spécifier des dépendances et des plages de versions, puis utiliser uniquement un fichier d’exigences pour résoudre un conflit et / ou les geler pour une version de production?
Faisons comme si je vivais dans un monde imaginaire (je sais, je sais) et mes dépendances en amont sont simples et garanties de ne jamais être en conflit ou de briser la compatibilité en amont. Est-ce que je serais obligé d’utiliser un fichier de conditions de pip ou simplement laisser pip / setuptools / dissortingbutions installer tout ce qui est basé sur install_requires
?
Il y a beaucoup de questions similaires sur ce sujet, mais je ne pouvais pas en trouver qui soient aussi fondamentales que quand utiliser l’une ou l’autre ou les utiliser ensemble harmonieusement.
Ma philosophie est que install_requires
devrait indiquer un minimum de ce dont vous avez besoin. Il peut inclure des exigences de version si vous savez que certaines versions ne fonctionneront pas; mais il ne devrait pas y avoir d’exigences de version où vous n’êtes pas sûr (par exemple, vous n’êtes pas sûr si une future version d’une dépendance va casser votre bibliothèque ou non).
D’autre part, les fichiers de spécifications doivent indiquer ce que vous savez fonctionne et peuvent inclure des dépendances facultatives que vous recommandez. Par exemple, vous pouvez utiliser SQLAlchemy mais suggérer MySQL, et donc mettre MySQLdb dans le fichier d’exigences).
Donc, en résumé: install_requires
est de garder les gens éloignés des choses que vous savez ne pas fonctionner, tandis que les fichiers d’exigences pour conduire les gens vers des choses que vous connaissez fonctionnent. L’une des raisons est que les exigences install_requires
sont toujours vérifiées et ne peuvent pas être désactivées sans modifier réellement les métadonnées du package. Donc, vous ne pouvez pas facilement essayer une nouvelle combinaison. Les fichiers d’exigences ne sont vérifiés qu’au moment de l’installation.
voici ce que j’ai mis dans mon setup.py:
# this grabs the requirements from requirements.txt REQUIREMENTS = [i.ssortingp() for i in open("requirements.txt").readlines()] setup( ..... install_requires=REQUIREMENTS )
Le Guide de l’utilisateur de Python Packaging contient une page sur ce sujet. Je vous recommande fortement de le lire:
install_requires
est là pour répertorier les dépendances du package qui doit absolument être installé pour que le package fonctionne. Il n’est pas destiné à épingler les dépendances à des versions spécifiques, mais les plages sont acceptées, par exemple install_requires=['django>=1.8']
. install_requires
est observé par pip install name-on-pypi
et d’autres outils.
requirements.txt
est juste un fichier texte, que vous pouvez choisir d’exécuter avec pip install -r requirements.txt
. Il est censé avoir des versions de toutes les dépendances et sous-dépendances, comme ceci: django==1.8.1
. Vous pouvez en créer un à l’aide de pip freeze > requirements.txt
. (Certains services, comme Heroku, exécutent automatiquement pip install -r requirements.txt
pour vous).
Je n’utilise que setup.py
et install_requires
car il n’y a qu’un seul endroit à regarder. C’est aussi puissant que d’avoir un fichier d’exigences et il n’y a pas de duplication à gérer.