Вопросы о Setuptools и альтернативах
В последнее время я видел хороший набор настроек, которые в последнее время бьют по интернетам. Совсем недавно я прочитал сообщение Джеймса Беннетта "Об упаковке" о том, почему никто не должен использовать setuptools. Из моего времени в #python на Freenode, я знаю, что есть несколько душ, которые абсолютно ненавидят его. Я считаю себя среди них, но я действительно использую его.
Я использовал setuptools для достаточного количества проектов, чтобы знать о его недостатках, и я предпочел бы что-то лучше. Мне не очень нравится формат яйца и его развертывание. Со всеми проблемами setuptools я не нашел лучшей альтернативы.
Мое понимание таких инструментов, как pip, заключается в том, что это означает замену easy_install (а не setuptools). На самом деле, pip использует некоторые компоненты setuptools, правильно?
В большинстве моих пакетов используется setup.ool, поддерживающий setuptools, который объявляет все зависимости. Когда они будут готовы, я построю sdist, bdist и bdist_egg и загружу их в pypi.
Если бы я хотел переключиться на использование pip, какие изменения мне нужно сделать, чтобы избавиться от зависимостей easy_install? Где объявляются зависимости? Я предполагаю, что мне нужно будет уйти от использования формата яйца и предоставить только исходные дистрибутивы. Если да, то как я могу создать каталоги с информацией о яйцах? или мне даже нужно?
Как это изменит мое использование virtualenv? Не использует ли virtualenv easy_install для управления средами?
Как это изменит мое использование setuptools, предоставленное командой "develop"? Должен ли я не использовать это? Какая альтернатива?
Я в основном пытаюсь получить представление о том, как будет выглядеть мой рабочий процесс разработки.
Прежде чем кто-либо подскажет это, я не ищу решение, зависящее от ОС. В основном я занимаюсь debian linux, но deb-пакеты не являются опцией, поскольку по причинам Ian Bicking выделяет здесь.
Ответы
Ответ 1
pip использует Setuptools и не требует никаких изменений в пакетах. Он фактически устанавливает пакеты с помощью Setuptools, используя:
python -c 'import setuptools; __file__="setup.py"; execfile(__file__)' \
install \
--single-version-externally-managed
Поскольку он использует этот параметр (--single-version-externally-managed
), он никогда не устанавливает яйца в виде zip файлов, не поддерживает несколько одновременно установленных версий программного обеспечения, и пакеты устанавливаются плоскими (например, python setup.py install
работает, если вы используете только distutils). Метаданные яйца все еще установлены. pip также, как easy_install, загружает и устанавливает все требования пакета.
Кроме того, вы также можете использовать файл требований для добавления других пакетов, которые должны быть установлены в пакетном режиме, и более точно выполнять требования к версии (не помещая эти точные требования в ваши файлы setup.py
). Но если вы не делаете файлы требований, вы будете использовать его так же, как easy_install.
Для вашего install_requires
я не рекомендую никаких изменений, если вы не пытались создать там очень точные требования, которые, как известно, хороши. Я думаю, что существует ограничение на то, насколько точно вы можете быть полезны в файлах setup.py
о версиях, потому что вы не можете точно знать, какая будет будущая совместимость новых библиотек, и я не рекомендую вам пытаться предсказать это. Файлы требований являются альтернативным местом для выработки консервативных требований к версии.
Вы все еще можете использовать python setup.py develop
, и на самом деле, если вы сделаете pip install -e svn+http://mysite/svn/Project/trunk#egg=Project
, он проверит это (в src/project
) и запустит setup.py develop
на нем. Так что рабочий процесс ничем не отличается.
Если вы запустите pip verbosely (например, pip install -vv
), вы увидите много команд, которые будут запущены, и вы, вероятно, узнаете большинство из них.
Ответ 2
Я пишу это в апреле 2014 года. Помните о дате написания о упаковке, дистрибутиве или установке Python. Похоже, что в последнее время, скажем, через три года произошло некоторое ослабление, совершенствование реализаций, стандартизация PEP и объединение фронтов.
Например, Python Packaging Authority - это "рабочая группа, которая поддерживает многие из соответствующих проектов в упаковке Python".
python.org
Руководство пользователя Python Packaging имеет Рекомендации по инструменту и Будущее Python Packaging".
distribute
была ветвью setuptools
, которая была устранена в июне 2013 года. В руководстве говорится: "Используйте setuptools
для определения проектов и создания распределений источников".
Как и в случае PEP 453 и Python 3.4, руководство рекомендует "Использовать pip
для установки пакетов Python из PyPI", а pip
входит в состав Python 3.4 и устанавливается в virtualenvs на pyvenv
, который также включен, Вы можете найти PEP 453 "обоснование" .
Есть также новые и новые инструменты, упомянутые в руководстве, в том числе wheel
и buildout
.
Я рад, что прочитал две следующие технические/полуполитические истории.
Martijn Faassen в 2009 году: История упаковки Python.
И Армин Роначер в июне 2013 года (название несерьезно): Python Packaging: ненависть, ненависть, ненависть везде.
Ответ 3
Для начала, пип действительно новый. Новые, неполные и в значительной степени не проверенные в реальном мире.
Это показывает большие перспективы, но до тех пор, пока он не сможет сделать все, что может сделать easy_install/setuptools, он вряд ли поймает большой путь, конечно, не в корпорации.
Easy_install/setuptools большой и сложный - и это оскорбляет многих людей. К сожалению, есть действительно веская причина для этой сложности, которая заключается в том, что она обслуживает огромное количество различных вариантов использования. Моя собственная поддержка большого ( > 300) пула пользователей настольных компьютеров, а также сетку с аналогичным размером с часто обновляемым приложением. Понятие о том, что мы могли бы сделать это, позволяя каждому пользователю устанавливать из источника, смехотворно - яйца зарекомендовали себя как надежный способ распространения моего проекта.
Мой совет: научитесь использовать setuptools - это действительно замечательная вещь. Большинство людей, которые его ненавидят, не понимают этого или просто не используют прецедент для полнофункциональной системы распространения.
: -)