Как настроить файл requirements.txt для нескольких сред?

113

У меня два филиала: разработка и производство. У каждого есть зависимости, некоторые из которых различны. Разработка указывает на зависимости, которые сами находятся в разработке. То же самое и с производством. Мне нужно выполнить развертывание в Heroku, который ожидает зависимости каждой ветки в одном файле с именем «requirements.txt».

Как лучше всего организовать?

Что я подумал:

  • Поддерживайте отдельные файлы требований, по одному в каждой ветке (должны выдерживать частые слияния!)
  • Скажите Heroku, какой файл требований я хочу использовать (переменная среды?)
  • Написание сценариев развертывания (создание временной ветки, изменение файла требований, фиксация, развертывание, удаление временной ветки)
Чарльз Р.
источник
1
более простой сценарий развертывания: поддерживать 2 файла. используйте символическую ссылку между ними.
Udy

Ответы:

210

Вы можете каскадировать файлы требований и использовать флаг «-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 специально ищет "requirements.txt" в корне проекта, он должен просто отражать prod, например:

requirements.txt:

# Mirrors prod
-r requirements/prod.txt
Кристиан Эбботт
источник
2
Вы проигнорировали проблему использования отдельных файлов требований для разных сред на heroku.
Эд Дж
30
Я считаю, что мой ответ касался этого.
Кристиан Эбботт,
1
Я искал способ иметь разные требования к Heroku для постановки (где мне нужны дополнительные пакеты отладки) и производственной среды (где мне не нужны эти пакеты отладки). К сожалению, как сказал @EdJ, этот ответ не касается этого.
Антуан Пинсар
1
Я мог неправильно понять ваш вопрос или, возможно, ваш вопрос отличается от исходного плаката. Но для пояснения: файл requirements.txt промежуточной ветки может содержать «-r requirements / staging.txt» (или аналогичный), а ветвь prod может содержать «-r requirements / prod.txt» (см. Конец моего ответа). Синхронизируйте соответствующую ветку с соответствующим экземпляром Heroku.
Christian Abbott
2
@SohamNavadiya Я не об этом спрашивал. Скажем, у меня есть файл base.txtс 3 пакетами и dev.txtс 1 пакетом в нем (и -r base.txt). В моей виртуальной среде установлены ВСЕ 4 пакета. Я хочу сейчас установить 5-й пакет и указать его в базе, а НЕ в разработке, как мне это сделать? Конечно, я могу установить его, pip freeze > base.txtно это НЕ решает проблемы. Затем он помещает зависимость 4-го разработчика в базу, которую я не хочу.
Manan Mehta
12

На сегодняшний день жизнеспособный вариант, которого не существовало, когда были опубликованы исходный вопрос и ответ, - это использовать pipenv вместо pip для управления зависимостями.

С помощью pipenv ручное управление двумя отдельными файлами требований, например с помощью pip, больше не требуется, и вместо этого pipenv управляет самими пакетами разработки и производства посредством взаимодействия в командной строке.

Чтобы установить пакет для использования в производстве и разработке:

pipenv install <package>

Чтобы установить пакет только для среды разработки:

pipenv install <package> --dev

С помощью этих команд pipenv сохраняет конфигурацию среды и управляет ею в двух файлах (Pipfile и Pipfile.lock). Текущий пакет сборки Python от Heroku изначально поддерживает pipenv и будет настраивать себя из Pipfile.lock, если он существует, вместо файла requirements.txt.

См. Ссылку pipenv для получения полной документации по инструменту.

Кристиан Эбботт
источник
5
pipenv - пустая трата времени. Блокировка длится слишком долго.
nurettin
10
pipenv не работает почти во всех аспектах. Он многообещает, но поставляет очень мало
ospider
5
@ospider Ежедневно использую pipenv и не испытываю таких негативных проблем, о которых сообщаете вы и nurettin. Работа с pipenv версии 2018.10.13. Таким образом, разорванное во всех отношениях заявление является очень пустым.
Kwuite
1
@Kwuite Я разделяю мнение вашего последнего предложения. Когда комментарий критичный, но бессодержательный, в диалоге мало.
Christian Abbott
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. 
нуреттин
источник