A première vue, il ne semble que requirements.txt
et setup.py
sont des doublons stupides, mais il est important de comprendre que si la forme est similaire, la fonction prévue est très différente.
Le but d'un auteur de package, lors de la spécification des dépendances, est de dire "partout où vous installez ce package, ce sont les autres packages dont vous avez besoin, pour que ce package fonctionne."
En revanche, l'auteur du déploiement (qui peut être la même personne à un moment différent) a un travail différent, en ce sens qu'il dit "voici la liste des packages que nous avons rassemblés et testés et que je dois maintenant installer".
L'auteur du package écrit pour une grande variété de scénarios, car ils mettent leur travail à disposition de manière qu'ils ne connaissent peut-être pas et n'ont aucun moyen de savoir quels packages seront installés à côté de leur package. Afin d'être un bon voisin et d'éviter les conflits de versions de dépendances avec d'autres packages, ils doivent spécifier une gamme de versions de dépendances aussi large que possible. C'est ce que install_requires
dans le setup.py
fait.
L'auteur du déploiement écrit pour un objectif très différent et très spécifique: une seule instance d'une application ou d'un service installé, installé sur un ordinateur particulier. Afin de contrôler précisément un déploiement et d'être sûr que les bons packages sont testés et déployés, l'auteur du déploiement doit spécifier la version exacte et l'emplacement source de chaque package à installer, y compris les dépendances et les dépendances des dépendances. Avec cette spécification, un déploiement peut être appliqué de manière répétée à plusieurs machines, ou testé sur une machine de test, et l'auteur du déploiement peut être sûr que les mêmes packages sont déployés à chaque fois. C'est ce que requirements.txt
fait un .
Vous pouvez donc voir que, bien qu'ils ressemblent tous les deux à une grande liste de packages et de versions, ces deux choses ont des tâches très différentes. Et c'est vraiment facile de mélanger cela et de se tromper! Mais la bonne façon de penser à cela est que requirements.txt
c'est une "réponse" à la "question" posée par les exigences dans tous les différents setup.py
fichiers de package. Plutôt que de l'écrire à la main, il est souvent généré en disant à pip de regarder tous les setup.py
fichiers dans un ensemble de packages souhaités, de trouver un ensemble de packages qui, selon lui, répond à toutes les exigences, puis, après leur installation, "geler" "cette liste de packages dans un fichier texte (c'est de là que pip freeze
vient le nom).
Donc, le point à retenir:
setup.py
devrait déclarer les versions de dépendances les plus lâches qui sont toujours utilisables. Son travail consiste à dire avec quoi un package particulier peut fonctionner.
requirements.txt
est un manifeste de déploiement qui définit un travail d'installation complet et ne doit pas être considéré comme lié à un seul package. Son travail consiste à déclarer une liste exhaustive de tous les packages nécessaires pour faire fonctionner un déploiement.
- Parce que ces deux choses ont un contenu et des raisons d'exister si différents, il n'est pas possible de simplement copier l'une dans l'autre.
Références:
install_requires
est utilisé pour déclarer les dépendances sur les packages qui sont nécessaires au fonctionnement du package et sont utilisées par le développeur du package, tandis qu'ilrequirements.txt
est utilisé pour automatiser l'installation des environnements, qui permet d'installer des logiciels supplémentaires et d'effectuer l'épinglage de version et est utilisé par les administrateurs système déployant le paquet. Leur rôle et leur public cible diffèrent considérablement, donc essayer de les combiner comme le souhaite OP est une véritable erreur de conception.