在我的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
软件包版本才能安装所需的软件包。有办法避免这种额外的步骤吗?
答案 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 }}的要求较宽松。