Рекомендации: как вы указываете требуемые зависимости в файле setup.py?
Вот как я это делаю сейчас:
import os
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))
requires = [
'pyramid',
'pyramid_debugtoolbar',
'waitress',
'requests',
'mock',
'gunicorn',
'mongoengine',
]
setup(name='repoapi',
version='0.0',
description='repoapi',
packages=find_packages(),
include_package_data=True,
zip_safe=False,
install_requires=requires,
tests_require=requires,
test_suite="repoapi",
entry_points="""\
[paste.app_factory]
main = repoapi:main
""",
)
Это хорошо? У меня есть троллейбусы. Например, для пирамиды я не могу использовать системный плагин nosetests для запуска тестов. Мне нужно установить pyramid
в глобальных пакетах python!
Но я не хочу этого. Поэтому я должен установить нос в virtualenv этого проекта. Но я не хочу, чтобы это была зависимость. Я не чувствую, что он должен принадлежать requires
. Это не так. Тем не менее, я также не хочу устанавливать вручную все время. Да, я знаю, что у меня много, я не хочу этого делать и что...
Но как бы вы это решили? Я не хочу вмешиваться в глобальные пакеты сайта python, но я хочу установить нос в качестве части виртуального.
Кроме того, файлы требований для установки пакета. Это немного более точно, потому что мне не нужно указывать версию вручную, и мне не нужно бояться обновлять setup.py вручную. Просто бросьте pip freeze > file.txt
и сделайте.
Однако, pip может возвращать мусор, потому что мы бросаем мусорные пакеты в virtualenv.
Так много лезвий. Какая лучшая практика? Как вы справляетесь с этими проблемами?
Возможно, я пропустил это, но https://github.com/django/django/blob/master/setup.py, как это сделал Django?
Ответы
Ответ 1
Вы можете разделить свои требования на "устанавливать" зависимости и "тестировать" зависимости следующим образом:
import os
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))
install_requires = [
'pyramid',
'pyramid_debugtoolbar',
'waitress',
'requests',
'gunicorn',
'mongoengine',
]
tests_require = [
'mock',
'nose',
]
setup(name='repoapi',
...
install_requires=install_requires,
tests_require=tests_require,
test_suite="nose.collector",
...
)
Таким образом, когда кто-то устанавливает пакет, устанавливаются только "установки" зависимостей. Итак, если кто-то хочет использовать пакет (и они не заинтересованы в запуске тестов), тогда им не нужно устанавливать тестовые зависимости.
Если вы хотите запустить тесты, вы можете использовать это:
$ python setup.py test
В docs:
Обратите внимание, что эти требуемые проекты не будут установлены в системе, где выполняются тесты, но загружаются только в каталог установки проектов, если они еще не установлены локально.
Как только "тестовые" зависимости будут установлены, тогда будет запущена команда "test_suite". Поскольку вы упоминали нос в качестве своего предпочтительного тестировщика, я показал, как вы используете "нос .collector" для его настройки.
Кстати, Django setup.py - не самый чистый пример для понимания основ setuptools. Я думаю, что Sentry setup.py - лучший пример для изучения.