-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Poniżej proponowany przeze mnie opis aktualizacji zależności. Tak to obecnie robimy w Concencie.
requirements.lock
i requirements.txt
W repozytorium przechowujemy dwie osobne listy zależności:
requirements.txt
- zawiera tylko bezpośrednie zależności naszej aplikacji. Zwykle bez określonej wersji. Ograniczenia co do wersji mogą zostać dodane jeżeli wiemy że dana wersja na pewno nie działa albo gdy chcemy, aby updejt pakietu nie został wykonany automatycznie przy aktualizowaniu wszystkich zależności.requirements.lock
- zawiera listę wszystkich zależności aplikacji oraz zależności naszych zależności. Wszystkie z określoną dokładną wersją. Jeżeli pakiet jest instalowany bezpośrednio z githuba to ten plik powinien wskazywać na dokłany commit (a nie gałąź). Dzięki temu wszyscy są w stanie pracować z ustalonymi wersjami zależności i te same zależności zostaną zainstalowane w środowisku produkcyjnym.
Przykład requirements.txt
:
Django >= 1.11, < 1.12
django-constance[database]
requests
-e git://github.com/dbtsai/[email protected]#egg=python-mimeparse
Wygenerowany z niego requirements.lock
:
certifi==2018.4.16
chardet==3.0.4
Django==1.11.14
django-constance==2.2.0
django-picklefield==1.0.0
idna==2.7
-e git://github.com/dbtsai/python-mimeparse.git@9a758d1a68ebdb71111dc244acd0a4be42e6bdc8#egg=python_mimeparse
pytz==2018.5
requests==2.19.1
urllib3==1.23
Nazewnictwo plików
Prawie w każdym projekcie istnieje requirements.txt
, ale nazwy dla drugiego pliku mogą być różne. Nie ma też ustalonej w Pythonie konwencji czy requirements.txt
zawiera tylko bezpośrednie zależności czy wszystkie.
W jednym z naszych projektów requirements.txt
zawierał wszystkie zależności, a te bezpośrednie były w pliku requirements.in
. Obecnie zalecane są nazwy podane powyżej.
Dodawanie nowych zależności:
- Dodaj nowe pakiety do
requirements.txt
- Utwórz czystego virtualenva
- Zainstaluj zależności z
requirements.lock
- Zainstaluj zależności z
requirements.txt
- Wygeneruj nowy
requirements.lock
za pomocąpip freeze
.
Przykład:
virtualenv /tmp/clean-env
source /tmp/clean-env/bin/activate
pip install --upgrade pip
pip install --requirement requirements.lock
pip install --requirement requirements.txt
pip freeze > requirements.lock
Ten sposób aktualizacji zapewnia, że nie zostaną zaktualizowane zależności innych pakietów. Aktualizacja wszystkich zależności zawsze niesie ze sobą ryzyko, że któryś z nich będzie niekompatybilny i spowoduje problemy. Dodając nowy pakiet chcemy skupić się tylko na nim, aby nie komplikować sobie zadania. Aktualizację reszty (jeżeli jest konieczna) możemy wykonać jako osobne zadanie.
Aktualizowanie wszystkich zależności do najnowszych wersji
- Sprawdź czy nie trzeba ręcznie podbić wersji któregoś z pakietów, który ma ograniczenia na wersję w
requirements.txt
. - Utwórz czystego virtualenva
- Zainstaluj zależności z
requirements.txt
- Wygeneruj nowy
requirements.lock
za pomocąpip freeze
.
Przykład:
virtualenv /tmp/clean-env
source /tmp/clean-env/bin/activate
pip install --upgrade pip
pip install --requirement requirements.txt
pip freeze > requirements.lock