Переустановите virtualenv с помощью tox при изменении требований.txt или setup.py

Раньше я вручную использовал Makefile, который выглядел примерно так:

.PHONY: all
all: tests

.PHONY: tests
tests: py_env
    bash -c 'source py_env/bin/activate && py.test tests'

py_env: requirements_dev.txt setup.py
    rm -rf py_env
    virtualenv py_env
    bash -c 'source py_env/bin/activate && pip install -r requirements_dev.txt'

Это имело приятный побочный эффект: если бы я изменил requirements_dev.txt или setup.py, он перестроил бы мой virtualenv. Но кажется немного неуклюжим.

Я хотел бы использовать tox, чтобы сделать то же самое. Я понимаю, что у tox есть опция --recreate, но я бы предпочел называть ее только, когда мне нужно.

Моя новая установка выглядит примерно так:

# Makefile
.PHONY: all
all: tests

.PHONY: tests
tests:
    tox

а также

# tox.ini
[tox]
project = my_project
envlist = py26,py27

[testenv]
install_command = pip install --use-wheel {opts} {packages}
deps = -rrequirements_dev.txt
commands =
    py.test {posargs:tests}

Идеальное решение будет использовать только вещи из tox, однако приемлемое решение будет включать Makefile и флаг --recreate.


person Anthony Sottile    schedule 12.04.2014    source источник
comment
Я тоже хочу этот ответ.   -  person bukzor    schedule 12.04.2014
comment
очень творческий способ использования make, отличная идея. написать этот комментарий, чтобы указать, что для сценариев оболочки гораздо проще использовать команды в venv напрямую: py_env/bin/pip ... вместо bash -c 'source py_env/bin/activate && pip ...   -  person minusf    schedule 23.01.2020


Ответы (2)


Похоже, что в tox есть открытая проблема только для этой проблемы.

https://github.com/tox-dev/tox/issues/149 (нажмите, добавьте свой комментарий и проголосуйте, чтобы авторы знали, насколько распространена проблема)

Нам нужно будет либо отправить патч, либо обойти его. Временное решение, которое приходит на ум:

  1. Перечислите зависимости прямо в tox.ini. Используйте свою систему сборки, чтобы обеспечить синхронизацию файла tox.ini с requirements.txt.
  2. Добавьте в свой Makefile правило, которое делает tox --recreate всякий раз, когда изменяется файл requirements.txt.

Обходной путь 2 кажется наиболее простым.

person bukzor    schedule 12.04.2014

Вот обходной путь Makefile, с которым я столкнулся:

REBUILD_FLAG =

.PHONY: all
all: tests

.PHONY: tests
tests: .venv.touch
    tox $(REBUILD_FLAG)

.venv.touch: setup.py requirements.txt requirements_dev.txt
    $(eval REBUILD_FLAG := --recreate)
    touch .venv.touch

Пример:

$ make tests
touch .venv.touch
tox --recreate
[[ SNIP ]]
$ make tests
tox 
[[ SNIP ]]
$ touch requirements.txt
$ make tests
touch .venv.touch
tox --recreate
[[ SNIP ]]
person Anthony Sottile    schedule 13.04.2014