Подтвердить что ты не робот

Рекомендации: как вы указываете требуемые зависимости в файле 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?

4b9b3361

Ответ 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 - лучший пример для изучения.