Na pierwszy rzut oka, wydaje się, że requirements.txt
i setup.py
są głupie duplikaty, ale ważne jest, aby zrozumieć, że podczas gdy forma jest podobna, zamierzona funkcja jest zupełnie inna.
Celem autora pakietu, określając zależności, jest powiedzenie „gdziekolwiek instalujesz ten pakiet, są to inne pakiety, których potrzebujesz, aby ten pakiet działał”.
W przeciwieństwie do tego autor wdrażania (którym może być ta sama osoba w innym czasie) ma inne zadanie, mówiąc: „Oto lista pakietów, które zebraliśmy i przetestowaliśmy i które muszę teraz zainstalować”.
Autor pakietu pisze dla wielu różnych scenariuszy, ponieważ udostępniają swoją pracę w taki sposób, że mogą nie wiedzieć, i nie mają możliwości dowiedzenia się, jakie pakiety zostaną zainstalowane wraz z pakietem. Aby być dobrym sąsiadem i uniknąć konfliktów wersji zależności z innymi pakietami, muszą określić możliwie szeroki zakres wersji zależności. To, co install_requires
się setup.py
robi.
Autor wdrożenia pisze o bardzo innym, bardzo konkretnym celu: pojedynczej instancji zainstalowanej aplikacji lub usługi zainstalowanej na określonym komputerze. Aby dokładnie kontrolować wdrożenie i upewnić się, że odpowiednie pakiety zostały przetestowane i wdrożone, autor wdrażania musi określić dokładną wersję i lokalizację źródłową każdego pakietu do zainstalowania, w tym zależności i zależności zależności. Dzięki tej specyfikacji wdrożenie może być wielokrotnie stosowane na kilku komputerach lub testowane na maszynie testowej, a autor wdrażania może być pewny, że za każdym razem wdrażane są te same pakiety. To właśnie requirements.txt
robi.
Widać więc, że chociaż oba wyglądają jak duża lista pakietów i wersji, te dwie rzeczy mają bardzo różne zadania. I zdecydowanie łatwo to pomieszać i źle to zrobić! Ale właściwym sposobem myślenia o tym jest requirements.txt
„odpowiedź” na „pytanie” wynikające z wymagań we wszystkich setup.py
plikach pakietu. Zamiast pisać ręcznie, często jest generowany przez polecenie pipowi, aby sprawdził wszystkie setup.py
pliki w zestawie pożądanych pakietów, znalazł zestaw pakietów, które jego zdaniem spełniają wszystkie wymagania, a następnie, po ich zainstalowaniu, „zamroził” msgstr "ta lista pakietów do pliku tekstowego ( pip freeze
stąd pochodzi nazwa).
Więc na wynos:
setup.py
powinien zadeklarować możliwie najlżejsze wersje zależności, które nadal są wykonalne. Jego zadaniem jest określenie, z czym konkretny pakiet może współpracować.
requirements.txt
jest manifestem wdrażania, który definiuje całe zadanie instalacyjne i nie powinien być traktowany jako powiązany z żadnym pakietem. Jego zadaniem jest zadeklarowanie wyczerpującej listy wszystkich niezbędnych pakietów do wdrożenia.
- Ponieważ te dwie rzeczy mają tak różne treści i powody istnienia, nie można po prostu skopiować jednej do drugiej.
Bibliografia:
install_requires
służy do deklarowania zależności od pakietów, które są wymagane do działania pakietu i są używane przez programistę pakietu, natomiastrequirements.txt
służy do automatyzacji instalacji środowisk, co umożliwia instalowanie dodatkowego oprogramowania i przypinanie wersji i jest używany przez sysadmins wdrażających pakiet. Ich rola i grupa docelowa różnią się znacznie, więc próba łączenia ich jak życzenia OP jest prawdziwym błędem projektowym imho.