当requirements.txt或setup.py变更时,如何用tox重新安装virtualenv
之前我手动使用的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,它会自动重建我的虚拟环境。不过,这样操作起来感觉有点麻烦。
我想用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
这个选项。
2 个回答
6
这是我最终选择的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 ]]
14
看起来在tox这个工具里,有一个关于这个问题的未解决的情况。
https://github.com/tox-dev/tox/issues/149(点击链接可以留言和投票,让作者知道这个问题有多普遍)
我们需要提交一个修复补丁,或者想办法绕过这个问题。这里有几个可以考虑的解决方法:
- 直接在
tox.ini
文件中列出依赖项。可以用你的构建系统来确保tox.ini
和requirements.txt
保持一致。 - 在你的Makefile中添加一个规则,当
requirements.txt
文件发生变化时,执行tox --recreate命令。
第二个解决方法看起来是最简单的。