18

現在、違いを確認するためのテストとして使用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ステートメントが常にdepsセクションにあるものをpoetry.lockファイルにあるもので上書きすることです(存在しない場合は自動生成されます)。これは、各 tox virtualenv がデフォルトで Django 3.0 をインストールするため、テスト マトリックスが Django 2.2 に対してテストしないことを意味します。

これがどのように機能するのかわかりません-インストールpoetry先の既存の環境を尊重して依存関係をインストールする必要がありますか?

では、私の質問は、依存関係マネージャーとして詩を使用して、マルチバージョンの tox (または travis) テスト マトリックスをどのように設定すればよいかということです。

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 環境を再作成した結果です。ご覧のとおり、tox はDjango==2.2virtualenv の依存関係としてインストールされますが、インストール時にpoetryこれを更新3.0します。

既存のパッケージのインストールを考慮して、詩のインストールを実行するソリューションが必要です。つまり、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)
  - ...

更新 2

以下のシノロックの指示に従います - tox ファイルを更新して、削除skip_distして含めるようにしisolated_buildました。これはうまくいきます。pytesttox はパッケージをビルドしてインストールしますが、含まれていない非開発バージョンとcoverage、後で含めたい多くの linting ツールのみです。つまり、tox を介して実行したいツールは、詩の dev-dependencies として指定されています。これらすべてをtoxファイルに含めるという解決策があります-しかし、それは自滅的なようです-私は詩とtoxの両方が依存関係を宣言しているためです。

[tool.poetry.dependencies]
python = "^3.6"
django = "^2.2 || ^3.0"

[tool.poetry.dev-dependencies]
pytest = "^3.0"
pytest-cov = "^2.8"
pytest-django = "^3.7"
coverage = "^4.5"
pylint = "^2.4"
pylint-django = "^2.0"
flake8 = "^3.7"
flake8-bandit = "^2.1"
flake8-docstrings = "^1.5"
isort = "^4.3"
mypy = "^0.750.0"
pre-commit = "^1.20"
black = "=19.3b0"

更新 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
4

1 に答える 1

14

十分にテストしていませんが、次のようなものが機能するはずです。

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

[testenv]
deps =
    django22: Django==2.2
    django30: Django==3.0
    # plus the dev dependencies
    pytest
    coverage

commands =
    pytest --cov=my_app tests/
    coverage report -m

toxドキュメントの「パッケージング」の章の」セクションを参照してください。


開発者の依存関係の繰り返しを避けるために、エクストラ機能に基づいて次のバリエーションを試すことができます。

tox.ini

[tox]
# ...

[testenv]
# ...
deps =
    django22: Django==2.2
    django30: Django==3.0
extras =
    test

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プラグインがあります。

于 2019-12-29T19:25:35.400 に答える