Auf den ersten Blick scheint es so, requirements.txt
als setup.py
wären es alberne Duplikate, aber es ist wichtig zu verstehen, dass die beabsichtigte Funktion sehr unterschiedlich ist, obwohl die Form ähnlich ist.
Das Ziel eines Paketautors bei der Angabe von Abhängigkeiten besteht darin, zu sagen: "Wo immer Sie dieses Paket installieren, sind dies die anderen Pakete, die Sie benötigen, damit dieses Paket funktioniert."
Im Gegensatz dazu hat der Bereitstellungsautor (der zu einem anderen Zeitpunkt dieselbe Person sein kann) einen anderen Job, da er sagt: "Hier ist die Liste der Pakete, die wir zusammengestellt und getestet haben und die ich jetzt installieren muss."
Der Paketautor schreibt für eine Vielzahl von Szenarien, da sie ihre Arbeit dort einsetzen, um sie auf eine Weise zu verwenden, von der sie möglicherweise nichts wissen, und nicht wissen können, welche Pakete neben ihrem Paket installiert werden. Um ein guter Nachbar zu sein und Konflikte mit Abhängigkeitsversionen mit anderen Paketen zu vermeiden, müssen sie eine möglichst große Anzahl von Abhängigkeitsversionen angeben, die möglicherweise funktionieren. Dies ist, was install_requires
in setup.py
tut.
Der Bereitstellungsautor schreibt für ein ganz anderes, sehr spezifisches Ziel: eine einzelne Instanz einer installierten Anwendung oder eines installierten Dienstes, die auf einem bestimmten Computer installiert ist. Um eine Bereitstellung genau zu steuern und sicherzustellen, dass die richtigen Pakete getestet und bereitgestellt werden, muss der Bereitstellungsautor die genaue Version und den Quellspeicherort jedes zu installierenden Pakets angeben, einschließlich der Abhängigkeiten und Abhängigkeiten der Abhängigkeiten. Mit dieser Spezifikation kann eine Bereitstellung wiederholt auf mehrere Computer angewendet oder auf einem Testcomputer getestet werden, und der Bereitstellungsautor kann sicher sein, dass jedes Mal dieselben Pakete bereitgestellt werden. Das macht ein requirements.txt
.
Sie sehen also, dass beide Dinge wie eine große Liste von Paketen und Versionen aussehen, diese beiden Dinge jedoch sehr unterschiedliche Aufgaben haben. Und es ist definitiv einfach, dies zu verwechseln und falsch zu verstehen! Der richtige Weg, darüber nachzudenken, requirements.txt
ist jedoch eine "Antwort" auf die "Frage", die sich aus den Anforderungen in allen verschiedenen setup.py
Paketdateien ergibt. Anstatt es von Hand zu schreiben, wird es häufig generiert, indem pip angewiesen wird, alle setup.py
Dateien in einer Reihe gewünschter Pakete zu betrachten, eine Reihe von Paketen zu finden, von denen es glaubt, dass sie alle Anforderungen erfüllen, und dann, nachdem sie installiert wurden, "einzufrieren" "diese Liste von Paketen in eine Textdatei (hier kommt der pip freeze
Name her).
Also zum Mitnehmen:
setup.py
sollte die lockersten möglichen Abhängigkeitsversionen deklarieren, die noch funktionsfähig sind. Seine Aufgabe ist es zu sagen, womit ein bestimmtes Paket funktionieren kann.
requirements.txt
ist ein Bereitstellungsmanifest, das einen gesamten Installationsjob definiert und nicht als an ein Paket gebunden angesehen werden sollte. Seine Aufgabe ist es, eine vollständige Liste aller erforderlichen Pakete zu deklarieren, damit eine Bereitstellung funktioniert.
- Da diese beiden Dinge so unterschiedliche Inhalte und Gründe für ihre Existenz haben, ist es nicht möglich, sie einfach ineinander zu kopieren.
Verweise:
install_requires
wird verwendet, um Abhängigkeiten von Paketen zu deklarieren, die für das Funktionieren des Pakets erforderlich sind und vom Entwickler des Pakets verwendet werden, währendrequirements.txt
die Installation von Umgebungen automatisiert wird. Dies ermöglicht die Installation zusätzlicher Software und das Fixieren der Version und wird von Systemadministratoren verwendet, die das Paket bereitstellen Paket. Ihre Rolle und Zielgruppe unterscheiden sich erheblich, daher ist der Versuch, sie wie OP-Wünsche zu kombinieren, imho ein echter Designfehler.