在我的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来安装所需的版本。有没有办法避免这个额外的步骤?
一个技巧是将需求从松散固定的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。
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |