如何在Tox中要求特定的软件包版本?

时间:2019-02-12 11:42:00

标签: python tox

在我的tox.ini文件中,依存关系通过requirements.txt使用的setup.py文件安装,如下所示:

requirements.txt文件包含django软件包的可接受范围,具体取决于安装的python版本,如下所示:

Django>=1.11,<2 ; python_version == '2.7'
Django>=1.11,<3 ; python_version > '3'

对于python3,我想确保测试在django 2.0以及默认安装的最新django 2.1+上运行,并遵守requirements.txt文件中指定的版本限制。为此,我使用以下命令强制安装所需的Django版本:

[tox]
envlist = {py27,py3}-django111,py3-django{20,21}

[testenv]
deps =
    -r{toxinidir}/requirements.txt

commands =
    django111: pip install 'Django>=1.11,<1.12'
    py3-django20: pip install 'Django>=2.0,<2.1'
    py3-django21: pip install 'Django>=2.1'
    pytest

理想情况下,我可以像这样添加到deps变量中:

[testenv]
deps =
    -r{toxinidir}/requirements.txt
    django111: Django>=1.11,<1.12
    py3-django20: Django>=2.0,<2.1
    py3-django21: Django>=2.1

commands =
    pytest

但是即使版本约束的指定方式没有冲突,pip也会not support double requirements and will throw an error

使用commands覆盖安装的缺点是,它需要删除通过django安装的requirements.txt软件包版本才能安装所需的软件包。有办法避免这种额外的步骤吗?

1 个答案:

答案 0 :(得分:0)

一个窍门是将需求从requirements.txt移到setup.py-在那里松散地固定了需求,以便所有django版本均可用。例如

# setup.py
from setuptools import setup, find_packages

setup(
    ...
    install_requires=[
        "Django>=1.11,<2.1",
    ]
)

,然后在tox.ini

中使用第二个建议
[testenv]
deps =
    -r{toxinidir}/requirements.txt
    django111: Django>=1.11,<1.12
    py3-django20: Django>=2.0,<2.1
    py3-django21: Django>=2.1

commands =
    pytest

...,只要requirements.txt中未列出Django要求即可。

之所以有效,是因为pip install分为两部分,第一部分来自tox:deps,其中您指定了硬性要求;第二部分来自等效于pip install -e .,其中{{1 }}的要求较宽松。