以前我手动使用看起来像这样的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
标记。
答案 0 :(得分:10)
对于这个问题,tox似乎存在一个未解决的问题。
https://github.com/tox-dev/tox/issues/149(点击并添加评论和投票,让作者了解问题的常见程度)
我们需要提交补丁或解决问题。想到的解决方法:
tox.ini
中列出依赖关系。使用您的构建系统确保tox.ini与requirements.txt
保持同步。解决方法2似乎最直接。
答案 1 :(得分:3)
这是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 ]]
答案 2 :(得分:1)
决定解决这个问题,我已经编写了一个tox插件来实现这一目标:https://github.com/asottile/tox-pip-extensions
该插件挂钩到virtualenv创建并使用venv-update来保持同步的依赖。
使用非常简单:
/X
一起安装/E
(在我的设置中,我在\
安装了tox-pip-extensions
并安装了tox
的virtualenv,然后符号链接{{1 }} - > ~/venv
)按如下方式启用扩展程序:
tox