Jak dostosować plik Require.txt do wielu środowisk?

113

Mam dwie gałęzie, rozwój i produkcję. Każdy ma zależności, z których niektóre są różne. Rozwój wskazuje na zależności, które same się rozwijają. Podobnie do produkcji. Muszę wdrożyć w Heroku, które oczekuje zależności każdej gałęzi w jednym pliku o nazwie „Requirements.txt”.

Jaki jest najlepszy sposób organizacji?

O czym myślałem:

  • Utrzymuj osobne pliki wymagań, po jednym w każdej gałęzi (muszą przetrwać częste połączenia!)
  • Powiedz Heroku, którego pliku wymagań chcę użyć (zmienna środowiskowa?)
  • Pisanie skryptów wdrażania (tworzenie gałęzi tymczasowej, modyfikowanie pliku wymagań, zatwierdzanie, wdrażanie, usuwanie gałęzi tymczasowej)
Charles R.
źródło
1
łatwiejszy skrypt wdrażania: utrzymuj 2 pliki. użyj łącza symbolicznego między nimi.
Udy,

Odpowiedzi:

209

Możesz kaskadować swoje pliki wymagań i użyć flagi „-r”, aby powiedzieć pipowi, aby zawarł zawartość jednego pliku w innym. Możesz podzielić swoje wymagania na modułową hierarchię folderów w następujący sposób:

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

Zawartość plików wyglądałaby następująco:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

Poza Heroku możesz teraz konfigurować takie środowiska:

pip install -r requirements/dev.txt

lub

pip install -r requirements/prod.txt

Ponieważ Heroku szuka konkretnie pliku „Requirements.txt” w katalogu głównym projektu, powinien po prostu odtworzyć kopię lustrzaną, na przykład:

wymagania.txt:

# Mirrors prod
-r requirements/prod.txt
Christian Abbott
źródło
2
Zignorowałeś problem używania oddzielnych plików wymagań dla różnych środowisk w Heroku.
Ed J
30
Myślę, że moja odpowiedź dotyczyła tego.
Christian Abbott
1
Szukałem sposobu, aby mieć inne wymagania dotyczące Heroku w zakresie przejściowym (gdzie chcę dodatkowych pakietów debugowania) i środowiska produkcyjnego (gdzie nie potrzebuję tych pakietów debugowania). Niestety, jak powiedział @EdJ, ta odpowiedź nie rozwiązuje tego problemu.
Antoine Pinsard,
1
Mogę źle zrozumieć Twoje pytanie lub być może Twoje pytanie różni się od oryginalnego plakatu. Ale dla wyjaśnienia, wymagania.txt gałęzi pomostowej może zawierać „-r wymagania / staging.txt” (lub podobne), podczas gdy gałąź prod może zawierać „-r wymagania / prod.txt” (patrz koniec mojej odpowiedzi). Zsynchronizuj odpowiednią gałąź z odpowiednią instancją Heroku.
Christian Abbott,
2
@SohamNavadiya Nie o to prosiłem. Powiedzmy, że mam base.txtpakiet zawierający 3 pakiety i dev.txt1 pakiet (i -r base.txt). WSZYSTKIE 4 pakiety są zainstalowane w moim środowisku wirtualnym. Chcę teraz zainstalować piąty pakiet i wyświetlić go w bazie, a nie w wersji deweloperskiej, jak mam to zrobić? Jasne, mogę to zainstalować, pip freeze > base.txtale to NIE rozwiązuje problemu. Następnie umieszcza czwartą zależność dev w bazie, której nie chcę.
Manan Mehta
11

Obecnie realną opcją, która nie istniała, kiedy opublikowano oryginalne pytanie i odpowiedź, jest użycie pipenv zamiast pip do zarządzania zależnościami.

Dzięki pipenv ręczne zarządzanie dwoma oddzielnymi plikami wymagań, takimi jak pip, nie jest już konieczne, a zamiast tego pipenv samodzielnie zarządza pakietami programistycznymi i produkcyjnymi za pośrednictwem interakcji w wierszu poleceń.

Aby zainstalować pakiet do użytku w produkcji i rozwoju:

pipenv install <package>

Aby zainstalować pakiet tylko dla środowiska programistycznego:

pipenv install <package> --dev

Za pomocą tych poleceń pipenv przechowuje i zarządza konfiguracją środowiska w dwóch plikach (Pipfile i Pipfile.lock). Bieżący pakiet kompilacji Heroku dla Pythona natywnie obsługuje pipenv i konfiguruje się z Pipfile.lock, jeśli istnieje, zamiast wymagania.txt.

Zobacz odsyłacz pipenv, aby uzyskać pełną dokumentację narzędzia.

Christian Abbott
źródło
5
pipenv to strata czasu. Blokowanie trwa zbyt długo.
nurettin
10
pipenv jest zepsuty prawie we wszystkich aspektach. Wiele obiecuje, ale jest ich niewiele
ospider
5
@ospider Codziennie używam pipenv i nie doświadczam tak negatywnych problemów, jak zgłaszacie ty i nurettin. Praca z wersją pipenv 2018.10.13. Zepsuty we wszystkich aspektach jest zatem bardzo pustym stwierdzeniem.
Kwuite
1
@Kwuite Podzielam zdanie z twojego ostatniego zdania. Niewiele jest dialogu, w którym można się zaangażować, gdy komentarz jest krytyczny, ale pusty.
Christian Abbott,
3
Zgadzam się z nurettinem i ospiderem. pipenv jest okropny.
Andrew Palmer
3

Jeśli wymagasz, aby móc przełączać się między środowiskami na tej samej maszynie, może być konieczne utworzenie różnych folderów virtualenv dla każdego środowiska, na które chcesz się przełączyć.

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
nurettin
źródło