Переустановите 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, чтобы синхронизировать зависимости.
Использование довольно просто: