На первый взгляд кажется, что requirements.txt
иsetup.py
глупые дубликатами, но важно понимать , что в то время как форма похожа, предполагаемая функция очень отличается.
При указании зависимостей цель автора пакета - сказать: «Где бы вы ни устанавливали этот пакет, это другие пакеты, которые вам нужны, чтобы этот пакет работал».
Напротив, у автора развертывания (который может быть одним и тем же человеком в разное время) есть другая работа, в которой они говорят: «Вот список пакетов, которые мы собрали вместе и протестировали и которые мне теперь нужно установить».
Автор пакета пишет для самых разных сценариев, потому что они размещают свою работу для использования способами, о которых они могут не знать, и не имеют возможности узнать, какие пакеты будут установлены вместе с их пакетом. Чтобы быть хорошим соседом и избежать конфликтов версий зависимостей с другими пакетами, им необходимо указать настолько широкий диапазон версий зависимостей, насколько это возможно. Это то, что install_requires
вsetup.py
делает.
Автор развертывания пишет для совсем другой, очень конкретной цели: один экземпляр установленного приложения или службы, установленный на конкретном компьютере. Чтобы точно контролировать развертывание и быть уверенным, что правильные пакеты протестированы и развернуты, автор развертывания должен указать точную версию и исходное местоположение каждого устанавливаемого пакета, включая зависимости и зависимости зависимости. С помощью этой спецификации развертывание может быть повторно применено к нескольким машинам или протестировано на тестовом компьютере, и автор развертывания может быть уверен, что одни и те же пакеты развертываются каждый раз. Это то, что requirements.txt
делает.
Итак, вы можете видеть, что, хотя оба они выглядят как большой список пакетов и версий, эти две вещи имеют совершенно разные задачи. И это определенно легко перепутать и ошибиться! Но правильный способ думать об этом - requirements.txt
это «ответ» на «вопрос», заданный требованиями во всех различных setup.py
файлах пакетов. Вместо того, чтобы писать это вручную, он часто генерируется командой pip, которая просматривает все setup.py
файлы в наборе желаемых пакетов, находит набор пакетов, который, по его мнению, соответствует всем требованиям, а затем, после их установки, "замораживается". «этот список пакетов в текстовый файл (отсюда и pip freeze
название).
Итак, вынос:
setup.py
должен объявить самые свободные версии зависимости, которые все еще работоспособны. Его задача - сказать, с чем может работать конкретный пакет.
requirements.txt
это манифест развертывания, который определяет всю работу по установке и не должен рассматриваться как связанный с каким-либо одним пакетом. Его задача состоит в том, чтобы объявить исчерпывающий список всех необходимых пакетов для развертывания.
- Поскольку эти две вещи имеют такое различное содержание и причины существования, просто невозможно скопировать одно в другое.
Ссылки:
install_requires
используется для объявления зависимостей от пакетов, которые требуются для работы пакета и используются разработчиком пакета, в то времяrequirements.txt
как используется для автоматизации установки сред, что позволяет устанавливать дополнительное программное обеспечение и выполнять закрепление версии, и используются системными администраторами, внедряющими пакет. Их роль и целевая аудитория существенно различаются, поэтому попытка объединить их, как пожелания ОП, является настоящей ошибкой дизайна.