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

sin*_*ere 7 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'
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

理想情况下,我可以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
Run Code Online (Sandbox Code Playgroud)

pip不支持双重要求,即使版本约束的指定方式没有冲突,也会抛出错误。

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

dan*_*van 2

一个技巧是将需求从松散固定的requirements.txt位置移至setup.py- 以便所有 django 版本都可用。例如

# setup.py
from setuptools import setup, find_packages

setup(
    ...
    install_requires=[
        "Django>=1.11,<2.1",
    ]
)
Run Code Online (Sandbox Code Playgroud)

然后使用你的第二个建议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
Run Code Online (Sandbox Code Playgroud)

...只要 Django 要求未在requirements.txt.

这是有效的,因为 被pip install分成两部分,第一部分来自tox:deps您指定硬性要求的部分,第二部分来自具有较宽松要求的等效pip install -e .部分setup.py