Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 我如何让tox和poethy一起工作来支持测试一个Python依赖项的多个版本?_Django_Tox_Python Poetry - Fatal编程技术网

Django 我如何让tox和poethy一起工作来支持测试一个Python依赖项的多个版本?

Django 我如何让tox和poethy一起工作来支持测试一个Python依赖项的多个版本?,django,tox,python-poetry,Django,Tox,Python Poetry,我正在将一个目前使用pipenv的项目切换到poetry作为测试,以查看区别。该项目是一个简单的、可再发行的Django应用程序。它支持Python 3.6-8、Django 2.2和3.0。我有一个tox.ini文件,它涵盖了Python和Django的所有组合,因此: [tox] envlist = py{36,37,38}-django{22,30} [testenv] whitelist_externals = poetry skip_install = true deps =

我正在将一个目前使用
pipenv
的项目切换到
poetry
作为测试,以查看区别。该项目是一个简单的、可再发行的Django应用程序。它支持Python 3.6-8、Django 2.2和3.0。我有一个
tox.ini
文件,它涵盖了Python和Django的所有组合,因此:

[tox]
envlist = py{36,37,38}-django{22,30}

[testenv]
whitelist_externals = poetry
skip_install = true

deps =
    django22: Django==2.2
    django30: Django==3.0

commands =
    poetry install -vvv
    poetry run pytest --cov=my_app tests/
    poetry run coverage report -m
我遇到的问题(在
pipenv
世界中不存在)是
poetry install
语句总是会用
poetry.lock
文件中的内容覆盖
deps
部分中的内容(如果不存在,将自动生成)。这意味着测试矩阵永远不会针对Django 2.2进行测试-因为每个tox virtualenv默认安装Django 3.0

我不明白这应该是如何工作的-使用
poetry
安装依赖项是否应该尊重它安装到的现有环境

那么-我的问题是-我如何建立一个多版本tox(或travis)测试矩阵,以Poethy作为依赖关系管理器

My
pyproject.toml
将Python/Django版本定义为:

[tool.poetry.dependencies]
python = "^3.6"
django = "^2.2 || ^3.0"
生成的
poetry.lock
文件(未提交)具有以下Django版本信息:

[[package]]
category = "main"
description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
name = "django"
optional = false
python-versions = ">=3.6"
version = "3.0"

更新:包括清洁毒物输出

这是我删除锁文件并重新创建tox环境时的结果。如您所见,tox在virtualenv中将
Django==2.2
作为依赖项安装,但
poetry
在安装时会将其更新为
3.0

我需要一个解决方案,运行诗歌安装,尊重现有的软件包安装。i、 e.如果
pyproject.toml
状态为
Django=“^2.2 | | ^3.0”
,并且已经安装了2.2,请锁定该版本-不要尝试升级

my-app$ tox -r -e py36-django22
py36-django22 recreate: .tox/py36-django22
py36-django22 installdeps: Django==2.2
py36-django22 installed: Django==2.2,my-app==0.1.0,pytz==2019.3,sqlparse==0.3.0
py36-django22 run-test: commands[0] | poetry install -vvv
Using virtualenv: .tox/py36-django22
Updating dependencies
Resolving dependencies...
   1: derived: django (^2.2 || ^3.0)
   ...
PyPI: 10 packages found for django >=2.2,<4.0
   ...
   1: Version solving took 3.330 seconds.
   1: Tried 1 solutions.

Writing lock file

Package operations: 52 installs, 1 update, 0 removals, 3 skipped

  - ...
  - Updating django (2.2 -> 3.0)
  - ...

更新3:解决方案

[tox]
isolated_build = True
envlist = lint, mypy, py{36,37,38}-django{22,30}

[travis]
python =
    3.6: lint, mypy, py36
    3.7: lint, mypy, py37
    3.8: lint, mypy, py38

[testenv]
deps =
    pytest
    pytest-cov
    pytest-django
    coverage
    django22: Django==2.2
    django30: Django==3.0

commands =
    django-admin --version
    pytest --cov=my_app tests/

[testenv:lint]
deps =
    pylint
    pylint-django
    flake8
    flake8-bandit
    flake8-docstrings
    isort
    black

commands =
    isort --recursive my_app
    black my_app
    pylint my_app
    flake8 my_app

[testenv:mypy]
deps =
    mypy

commands =
    mypy my_app

我还没有完全测试过它,但我相信类似的东西应该会起作用:

[tox]
envlist=py{36,37,38}-django{22,30}
独立构建=真
[测试]
副总裁=
Django=2.2
django30:Django==3.0
#加上开发依赖项
皮特斯特
新闻报道
命令=
pytest--cov=我的应用程序测试/
覆盖率报告-m


为了避免重复开发人员依赖关系,可以根据以下情况尝试以下变化:

tox.ini

[tox]
# ...
[测试]
# ...
副总裁=
Django=2.2
django30:Django==3.0
额外费用=
测试
pyproject.toml

[tool.poetry]
# ...

[tool.poetry.dependencies]
python = "^3.6"
django = "^2.2 || ^3.0"
#
pytest = { version = "^5.2", optional = true }

[tool.poetry.extras]
test = ["pytest"]

[build-system]
# ...

现在有tox插件试图更好地与基于诗歌的项目集成:

  • (免责声明:我的项目)

我自己不是诗歌用户,所以不能100%确定,因为我无法测试它,但是。。。我会尝试以下操作,以及删除
skip_install
whitelist_externals
,直接使用这些命令,而不使用
poetry install
poetry run
中的
命令。我认为将解决方案移到它自己的答案中会更清楚:)这非常接近-谢谢你(
insolated_build
是关键)-但是它只安装了非开发依赖项,这意味着它无法找到
pytest
来实际运行测试。理想情况下,运行测试的所有依赖项(
pytest
覆盖范围
等)将在开发依赖项中,而不是与应用程序打包。我想它在我的快速测试中使用了开发依赖项,但我记不清了,我没有在上面花费太多时间。但是,是的,我明白了,开发依赖项现在都是诗意的和tox的。使用setuptools,我将开发依赖项设置为附加项,并告诉tox安装附加项@Hugo I更新了答案,展示了如何避免重复开发依赖项的建议。它非常适合我的用例,但我可以看到它在其他用例中的缺点。。。
[tool.poetry]
# ...

[tool.poetry.dependencies]
python = "^3.6"
django = "^2.2 || ^3.0"
#
pytest = { version = "^5.2", optional = true }

[tool.poetry.extras]
test = ["pytest"]

[build-system]
# ...