Требования к настройке Setuptools

TL; DR: Есть ли способ подключить setuptool 'develop' для установки набора требований к разработке при запуске python setup.py develop?

Я создаю свой первый пакет python с помощью setuptools. Я задаю следующие требования:

requirements = [
    'click',
    'ansible',
    'fabric',
    'gitpython',
    'pyyaml',
    'jinja2',
    'yapsy'
]

test_requirements = [
    'pytest',
    'pytest-pep8',
    'pytest-cov',
]

setup(
...
    install_requires=requirements,
    tests_require=test_requirements,
...
)

Во время разработки я устанавливал пакет (в виртуальной среде) с помощью

python setup.py develop

и удаление с помощью:

python setup.py develop -u

Пакет использует entry_points для установки некоторых сценариев командной строки, поэтому это устанавливает для меня команды и позволяет мне редактировать пакет при одновременном тестировании команды.

У меня также есть некоторые зависимости, которые я использую для разработки... sphinx + extensions и еще пару вещей (вещи, которые не нужны для использования пакета). Я просто вручную устанавливаю их в виртуальной среде на данный момент. Я не видел никакой документации (и не нашел примеров в googles) о том, как подключить их с помощью setuptools.

Может быть, есть способ подключить setup.py для установки дополнительного набора требований? Другой метод, о котором я не читал?

Ответы

Ответ 1

Для получения дополнительной информации об использовании setup.py vs requirements.txt, я нашел эту статью полезной.

Обновление: сентябрь 2016 года

Я больше не использую requirements.txt (см. исходный ответ ниже) для установки только пакетов разработки. По-видимому, преобладающая мудрость заключается в том, что requirements.txt следует использовать для привязки развертываний к определенным номерам версий, обычно используя pip freeze > requirements.txt. Это гарантирует, что на всех ваших серверах установлены одинаковые версии зависимостей вашего проекта, а также зависимости зависимостей ваших проектов.

Вместо этого я использую параметр extras_require для setup.

requirements = [
    'click',
    'ansible',
    'fabric',
    'gitpython',
    'pyyaml',
    'jinja2',
    'yapsy'
]

setup({
    install_requires=requirements,
    extras_require={
        'dev': [
            'pytest',
            'pytest-pep8',
            'pytest-cov'
        ]
    }
})

Теперь, чтобы установить пакет для разработки, вы запустите pip install -e .[dev]. Это устанавливает все необходимые пакеты и, перечисленные в разделе dev extras_require.

Производственные установки все еще можно выполнить с помощью python setup.py install или pip install . (или с файлом requirements.txt).

Оригинальный ответ

Вот способ сделать это, что, похоже, соответствует рекомендациям, которые я использовал в отношении setup.py vs requirements.txt. Укажите все производственные зависимости в параметре install_requires setup.py.

requirements = [
    'click',
    'ansible',
    'fabric',
    'gitpython',
    'pyyaml',
    'jinja2',
    'yapsy'
]

setup({
    # ...
    install_requires=requirements
    # ...
})

Затем создайте файл requirements.txt, который инструктирует pip для установки ваших производственных зависимостей от setup.py, а также ваших зависимостей тестирования.

-e .

pytest
pytest-pep8
pytest-cov

Теперь вы можете установить пакет для разработки с помощью pip install -r requirements.txt. Строка -e . установит ваш пакет и его зависимости от setup.py в режиме разработки. Для установки на производство вы можете использовать python setup.py install или pip install .. Это будет устанавливать только зависимости, перечисленные в setup.py.