Переустановите 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'

У этого был хороший побочный эффект: если я изменил требования_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.

Ответ 1

Кажется, для этой проблемы существует открытая проблема для этого.

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

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

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

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

Ответ 2

В обходном пути 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 ]]

Ответ 3

Чтобы решить эту проблему, я написал плагин для токов, чтобы выполнить это: https://github.com/asottile/tox-pip-extensions

Плагин перехватывает виртуальное создание и использует venv-update, чтобы синхронизировать зависимости.

Использование довольно просто:

  • установите tox-pip-extensions рядом с tox (в моей настройке у меня есть virtualenv at ~/venv с установленными tox и tox-pip-extensions, а затем с символическими ссылками ~/venv/bin/tox~/bin/tox)
  • включить расширение следующим образом:

    [tox]
    tox_pip_extensions_ext_venv_update = true
    # the rest of your tox.ini file as normal...