Estoy cambiando un proyecto que utiliza actualmente pipenv
a poetry
una prueba para ver cuáles son las diferencias. El proyecto es una aplicación Django simple y redistribuible. Es compatible con Python 3.6-8 y Django 2.2 y 3.0. Tengo un tox.ini
archivo que cubre todas las combinaciones de Python y Django así:
[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
El problema que tengo (que no existe en el pipenv
mundo) es que la poetry install
declaración siempre sobrescribirá lo que esté en la deps
sección con lo que esté en el poetry.lock
archivo (que se generará automáticamente si no existe). Esto significa que la matriz de prueba nunca probará contra Django 2.2, ya que cada virtualenv tox tiene Django 3.0 instalado por defecto.
No entiendo cómo se supone que funciona esto: ¿la instalación de dependencias debe poetry
respetar el entorno existente en el que se está instalando, o no?
Entonces, mi pregunta es: ¿cómo configuro una matriz de prueba tox (o travis) de múltiples versiones, con la poesía como administrador de dependencias?
My pyproject.toml
define las versiones de Python / Django como:
[tool.poetry.dependencies]
python = "^3.6"
django = "^2.2 || ^3.0"
El poetry.lock
archivo generado (no confirmado) tiene esta información de versión de 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"
ACTUALIZACIÓN: incluye salida de toxinas limpia
Este es el resultado cuando elimino el archivo de bloqueo y recreo el entorno tóxico. Como puede ver, tox se instala Django==2.2
como una dependencia en virtualenv, pero poetry
luego lo actualiza 3.0
cuando se instala.
Necesito una solución que ejecute la instalación de poesía, respetando las instalaciones de paquetes existentes. es decir, si pyproject.toml
estados Django = "^2.2 || ^3.0"
, y 2.2 ya está instalado, entonces ancle a esa versión - no intente actualizar.
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)
- ...
ACTUALIZACIÓN 2
Siguiendo las instrucciones de sinoroc a continuación, he actualizado el archivo tox para eliminar skip_dist
e incluir isolated_build
. Esto funciona, más o menos. tox crea el paquete y lo instala, pero solo la versión que no es de desarrollo, que no incluye pytest
, coverage
y una gran cantidad de herramientas de linting que me gustaría incluir en un momento posterior. es decir, las herramientas que quiero ejecutar con tox se especifican como dev-dependencies en poesía. Hay una solución aquí, para incluir todos estos dentro del archivo tox, pero eso parece contraproducente, ya que entonces tengo poesía y tox que declaran dependencias.
[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"
ACTUALIZACIÓN 3: solución
[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
skip_install
ywhitelist_externals
, y usar los comandos directamente sinpoetry install
opoetry run
dentrocommands
.