Auf den ersten Blick scheint es so, dass requirements.txt
y setup.py
sind alberne Duplikate, aber es ist wichtig zu verstehen, dass die Form zwar ähnlich ist, aber die beabsichtigte Funktion sehr unterschiedlich ist.
Das Ziel eines Paketautors ist es, mit der Angabe von Abhängigkeiten zu sagen: "Wo auch immer Sie dieses Paket installieren, dies sind die anderen Pakete, die Sie benötigen, damit dieses Paket funktioniert."
Im Gegensatz dazu hat der Deployment-Autor (das kann dieselbe Person zu einem anderen Zeitpunkt sein) eine andere Aufgabe, indem 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 er seine Arbeit zur Verfügung stellt, damit sie in einer Art und Weise genutzt werden kann, die er nicht kennt, und er hat keine Möglichkeit zu wissen, welche Pakete neben seinem Paket installiert werden. Um ein guter Nachbar zu sein und Versionskonflikte mit anderen Paketen zu vermeiden, müssen sie eine möglichst große Bandbreite an Abhängigkeitsversionen angeben. Das ist es, was install_requires
in setup.py
tut.
Der Verfasser der Bereitstellung schreibt für ein ganz anderes, sehr spezifisches Ziel: eine einzelne Instanz einer installierten Anwendung oder eines Dienstes, die auf einem bestimmten Computer installiert ist. Um ein Deployment genau zu kontrollieren und sicher zu sein, dass die richtigen Pakete getestet und installiert werden, muss der Deployment-Autor die genaue Version und den Quellort jedes zu installierenden Pakets angeben, einschließlich der Abhängigkeiten und der Abhängigkeiten der Abhängigkeiten. Mit dieser Spezifikation kann eine Bereitstellung wiederholt auf mehreren Rechnern angewendet oder auf einem Testrechner getestet werden, und der Autor der Bereitstellung kann sicher sein, dass jedes Mal die gleichen Pakete bereitgestellt werden. Das ist es, was ein requirements.txt
tut.
Sie sehen also, dass beide zwar wie eine große Liste von Paketen und Versionen aussehen, aber sehr unterschiedliche Aufgaben haben. Und es ist wirklich leicht, das zu verwechseln und etwas falsch zu machen! Aber die richtige Art, darüber nachzudenken, ist, dass requirements.txt
ist eine "Antwort" auf die "Frage", die sich aus den Anforderungen in den verschiedenen setup.py
Paketdateien. Anstatt sie von Hand zu schreiben, wird sie oft erzeugt, indem pip angewiesen wird, sich alle setup.py
Dateien in einer Reihe von gewünschten Paketen, findet eine Reihe von Paketen, von denen es glaubt, dass sie alle Anforderungen erfüllen, und "friert" dann, nachdem sie installiert sind, diese Liste von Paketen in einer Textdatei ein (dies ist der Ort, an dem die pip freeze
Name stammt).
Die Quintessenz ist also:
setup.py
sollten die lockersten Versionen von Abhängigkeiten deklariert werden, die noch praktikabel sind. Seine Aufgabe ist es, zu sagen, womit ein bestimmtes Paket arbeiten kann.
requirements.txt
ist ein Bereitstellungsmanifest, das einen gesamten Installationsauftrag definiert und nicht als an ein bestimmtes Paket gebunden betrachtet werden sollte. Seine Aufgabe ist es, eine vollständige Liste aller Pakete zu deklarieren, die für eine Bereitstellung erforderlich sind.
- Da diese beiden Dinge so unterschiedliche Inhalte und Daseinsberechtigungen haben, ist es nicht möglich, das eine einfach in das andere zu kopieren.
Referenzen: