Як налаштувати Requix.txt для декількох середовищ?


112

У мене є дві галузі, розробка та виробництво. У кожного є залежності, деякі з яких різні. Розвиток вказує на залежності, які є самі в розвитку. Так само і для виробництва. Мені потрібно розгорнути в Heroku, який очікує залежності кожної гілки в одному файлі під назвою 'вимоги.txt'.

Який найкращий спосіб організувати?

Що я думав:

  • Підтримуйте окремі файли вимог, по одному у кожній гілці (повинні переживати часті злиття!)
  • Скажіть Heroku, який файл вимог я хочу використовувати (змінна середовище?)
  • Пишіть сценарії розгортання (створюйте тимчасову гілку, змінюйте файл вимог, здійснюйте, розгортайте, видаляйте гілку темп)

1
простіше розгортати сценарій: підтримувати 2 файли. використовувати симпосилання між ними.
Уді

Відповіді:


208

Ви можете каскадувати файли своїх вимог і використовувати прапор "-r", щоб повідомити pip, щоб включити вміст одного файлу всередині іншого. Ви можете розбити свої вимоги до модульної ієрархії папок, як це:

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

Вміст файлів виглядатиме так:

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
...

Поза межами Heroku тепер ви можете налаштувати такі середовища:

pip install -r requirements/dev.txt

або

pip install -r requirements/prod.txt

Оскільки Heroku спеціально шукає "вимоги.txt" у корені проекту, він повинен просто відображати продукт, як-от так:

вимоги.txt:

# Mirrors prod
-r requirements/prod.txt

2
Ви проігнорували проблему використання окремих файлів вимог для різних середовищ на heroku.
Ed J

29
Я вважаю, що моя відповідь вирішила це.
Крістіан Еббот

1
Я шукав способу мати різні вимоги до Heroku щодо постановки (де я хочу додаткові пакети налагодження) та виробничого середовища (де мені ці пакети налагодження не потрібні). На жаль, як сказав @EdJ, ця відповідь не стосується цього.
Антуан Пінсар

1
Я можу нерозуміти ваше запитання або, можливо, ваше питання відрізняється від оригінального плаката. Але для уточнення вимоги до інсталяції гілки.txt можуть містити "-r вимоги / staging.txt" (або подібні), в той час як галузь prod може містити "-r вимоги / prod.txt" (див. Кінець моєї відповіді). Синхронізуйте відповідну гілку з відповідним екземпляром Heroku.
Крістіан Еббот

2
@SohamNavadiya Це не те, про що я питав. Скажімо, у мене є base.txt3 пакети і dev.txt1 пакет (і -r base.txt). ВСЕ 4 пакети встановлені у моєму віртуальному середовищі. Я хочу зараз встановити 5-й пакет і перерахувати його в базі, а не в розробниках, як це зробити? Звичайно, я можу встановити це, pip freeze > base.txtале це НЕ вирішує проблему. Потім він ставить залежність 4-го диска в базу, яку я не хочу.
Манан Мехта

11

Сьогодні дієвим варіантом, який не існував, коли було розміщено оригінальний запитання та відповіді, є використання pipenv замість pip для управління залежностями.

З pipenv вручну керувати двома окремими файлами вимог, як-от pip, більше не потрібно, а натомість pipenv керує самими пакетами розробки та виробництва за допомогою взаємодій у командному рядку.

Щоб встановити пакет для використання як у виробництві, так і в розробці:

pipenv install <package>

Щоб встановити пакет лише для середовища розробки:

pipenv install <package> --dev

Через ці команди pipenv зберігає та керує конфігурацією середовища у двох файлах (Pipfile та Pipfile.lock). Поточний збірний пакет Python в Heroku підтримує pipenv і налаштовує себе з Pipfile.lock, якщо він існує замість вимог.txt.

Перейдіть за посиланням pipenv для повної документації на інструмент.


4
pipenv - це марна трата часу. Блокування триває занадто довго.
Нуреттін

9
pipenv порушений майже у всіх аспектах. Це обіцяє багато, але кораблів дуже мало
осіпдер,

5
@ospider Використовуючи pipenv щодня і не відчуваю таких негативних проблем, про які ви та нуреттин повідомляєте. Робота з pipenv версією 2018.10.13. Таким чином, розбита у всіх аспектах є дуже порожнім твердженням.
Kwuite

1
@Kwuite Я поділяю почуття вашого останнього речення. У нас мало діалогу, щоб брати участь у коментарях, коли коментар є критичним, але неоднозначним.
Крістіан Еббот

3
Погодьтеся з нуреттином та оспідером. pipenv жахливо.
Ендрю Палмер

3

Якщо вашою вимогою є можливість перемикатися між середовищами на одній машині, можливо, буде потрібно створити різні папки virtualenv для кожного середовища, на яке потрібно перейти.

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. 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.