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 explicitement les dépendances. Certaines de mes bibliothèques dépendent de bibliothèques tierces qui ont des dépendances transitives sur lesquelles je n'ai aucun contrôle.
Ce que j'essaie de réaliser, c'est que l' pip install
une de mes bibliothèques télécharge / installe toutes ses dépendances en amont. Ce avec quoi je me débat dans la documentation de pip, c'est si / comment les fichiers d'exigences peuvent le faire eux-mêmes ou s'ils ne sont vraiment qu'un complément à l'utilisation install_requires
.
Est-ce que j'utiliserais install_requires
dans toutes mes bibliothèques pour spécifier des dépendances et des plages de versions, puis utiliserais uniquement un fichier d'exigences pour résoudre un conflit et / ou les figer pour une version de production?
Supposons que je vis dans un monde imaginaire (je sais, je sais) et mes dépendances en amont sont simples et garanties de ne jamais entrer en conflit ou rompre la compatibilité descendante. Serais-je obligé d'utiliser un fichier d'exigences pip ou simplement laisser pip / setuptools / distribuer tout installer en fonction install_requires
?
Il y a beaucoup de questions similaires ici, mais je n'ai pas trouvé de questions aussi basiques que de savoir quand utiliser l'une ou l'autre ou les utiliser ensemble harmonieusement.
la source
Réponses:
Ma philosophie est que cela
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 avoir d'exigences de version pour lesquelles vous n'êtes pas sûr (par exemple, vous n'êtes pas sûr si une future version d'une dépendance cassera votre bibliothèque ou non).Fichiers Exigences d'autre part doivent indiquer ce que vous savez ne travail, et peuvent inclure des dépendances optionnelles que vous préconisez. Par exemple, vous pouvez utiliser SQLAlchemy mais suggérer MySQL, et ainsi mettre MySQLdb dans le fichier des exigences).
Donc, en résumé:
install_requires
c'est éloigner les gens des choses que vous savez ne pas fonctionner, tandis que les fichiers d'exigences pour diriger les gens vers des choses que vous savez fonctionnent. L'une des raisons à cela est que lesinstall_requires
exigences sont toujours vérifiées et ne peuvent pas être désactivées sans modifier réellement les métadonnées du package. Vous ne pouvez donc pas facilement essayer une nouvelle combinaison. Les fichiers d'exigences ne sont vérifiés qu'au moment de l'installation.la source
setup.py
install_requires=
dépsrequirements.txt
?-U
car cela pourrait remplacer les dépendances du fichier des exigences? Comment mettez-vous à niveau?voici ce que j'ai mis dans mon setup.py:
la source
--extra-index-url
dans les exigences soit requis et cela m'a explosé au visage. Merci @RomainHardouinLe guide de l'utilisateur de Python Packaging a une page sur ce sujet, je vous recommande vivement de la lire:
Résumé:
install_requires
est là pour lister les dépendances du package qui doivent absolument être installées pour que le package fonctionne. Il ne vise pas à épingler les dépendances à des versions spécifiques, mais les plages sont acceptées, par exempleinstall_requires=['django>=1.8']
.install_requires
est observé parpip install name-on-pypi
et d'autres outils.requirements.txt
est juste un fichier texte sur lequel vous pouvez choisir d'exécuterpip install -r requirements.txt
. Il est censé avoir les versions de toutes les dépendances et subdependencies épinglés, comme ceci:django==1.8.1
. Vous pouvez en créer un en utilisantpip freeze > requirements.txt
. (Certains services, comme Heroku, s'exécutent automatiquementpip install -r requirements.txt
pour vous.)pip install name-on-pypi
Ne regarde pasrequirements.txt
, seulementinstall_requires
.la source
Je n'utilise que
setup.py
etinstall_requires
parce qu'il n'y a qu'un seul endroit à regarder. C'est tout aussi puissant que d'avoir un fichier d'exigences et il n'y a pas de duplication à maintenir.la source