Używam pip z virtualenv do pakowania i instalowania niektórych bibliotek Pythona.
Wyobrażam sobie, że to, co robię, to dość powszechny scenariusz. Jestem opiekunem kilku bibliotek, dla których mogę jawnie określić zależności. Niektóre z moich bibliotek są zależne od bibliotek innych firm, które mają zależności przechodnie, nad którymi nie mam kontroli.
To, co próbuję osiągnąć, to pip install
pobranie / zainstalowanie wszystkich zewnętrznych zależności w jednej z moich bibliotek. W dokumentacji pip zmagam się z tym, czy / w jaki sposób pliki wymagań mogą to zrobić samodzielnie lub czy są one tylko dodatkiem do używania install_requires
.
Czy użyłbym install_requires
we wszystkich moich bibliotekach do określenia zależności i zakresów wersji, a następnie użyłbym pliku wymagań tylko do rozwiązania konfliktu i / lub zamrożenia go na potrzeby kompilacji produkcyjnej?
Udawajmy, że żyję w wyimaginowanym świecie (wiem, wiem), a moje wcześniejsze zależności są proste i gwarantują, że nigdy nie kolidują ani nie przerywają wstecznej kompatybilności. Czy byłbym zmuszony w ogóle użyć pliku wymagań pip, czy po prostu pozwolić pip / setuptools / distribute zainstalować wszystko na podstawie install_requires
?
Jest tutaj wiele podobnych pytań, ale nie mogłem znaleźć żadnego tak podstawowego, jak użycie jednego lub drugiego lub harmonijnego użycia ich obu razem.
źródło
Odpowiedzi:
Moja filozofia jest taka, że
install_requires
powinno wskazywać minimum tego, czego potrzebujesz. Może zawierać wymagania dotyczące wersji, jeśli wiesz że niektóre wersje nie będą działać; ale nie powinno mieć wymagań dotyczących wersji, w przypadku których nie jesteś pewien (np. nie jesteś pewien, czy przyszłe wydanie zależności zepsuje Twoją bibliotekę, czy nie).Z drugiej strony pliki wymagań powinny wskazywać, co wiesz, że działa, i mogą zawierać zalecane opcjonalne zależności. Na przykład możesz użyć SQLAlchemy, ale zasugerować MySQL, więc umieść MySQLdb w pliku wymagań).
Podsumowując:
install_requires
polega na trzymaniu ludzi z dala od rzeczy, o których wiesz, że nie działają, podczas gdy pliki wymagań mają prowadzić ludzi do rzeczy, o których wiesz, że działają. Jednym z powodów jest to, żeinstall_requires
wymagania są zawsze sprawdzane i nie można ich wyłączyć bez faktycznej zmiany metadanych pakietu. Nie możesz więc łatwo wypróbować nowej kombinacji. Pliki wymagań są sprawdzane tylko podczas instalacji.źródło
setup.py
install_requires=
deps wrequirements.txt
?-U
ponieważ może to przesłonić zależności z pliku wymagań? Jak aktualizujesz?oto co umieściłem w moim setup.py:
# this grabs the requirements from requirements.txt REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()] setup( ..... install_requires=REQUIREMENTS )
źródło
--extra-index-url
było wymagane krytyczne w wymaganiach i to wybuchło w mojej twarzy. Dzięki @RomainHardouinPodręcznik użytkownika pakietu Python zawiera stronę poświęconą temu tematowi, bardzo polecam ją przeczytać:
Podsumowanie:
install_requires
jest tam lista zależności pakietu, które absolutnie muszą być zainstalowane, aby pakiet działał. Nie służy do przypinania zależności do określonych wersji, ale na przykład akceptowane są zakresyinstall_requires=['django>=1.8']
.install_requires
jest obserwowany przezpip install name-on-pypi
i inne narzędzia.requirements.txt
to tylko plik tekstowy, z którym możesz skorzystaćpip install -r requirements.txt
. To oznaczało mieć wersje wszystkich zależności i subdependencies przypięte coś takiego:django==1.8.1
. Możesz go utworzyć za pomocąpip freeze > requirements.txt
. (Niektóre usługi, takie jak Heroku, uruchamiają się automatyczniepip install -r requirements.txt
.)pip install name-on-pypi
Nie patrzyrequirements.txt
, tylko nainstall_requires
.źródło
Zawsze używam tylko
setup.py
i,install_requires
ponieważ jest tylko jedno miejsce, na które mogę spojrzeć. Jest tak samo potężny, jak posiadanie pliku wymagań i nie trzeba go dublować.źródło