当requirements.txt或setup.py变更时,如何用tox重新安装virtualenv

14 投票
2 回答
6811 浏览
提问于 2025-04-18 02:30

之前我手动使用的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(点击链接可以留言和投票,让作者知道这个问题有多普遍)

我们需要提交一个修复补丁,或者想办法绕过这个问题。这里有几个可以考虑的解决方法:

  1. 直接在tox.ini文件中列出依赖项。可以用你的构建系统来确保tox.inirequirements.txt保持一致。
  2. 在你的Makefile中添加一个规则,当requirements.txt文件发生变化时,执行tox --recreate命令。

第二个解决方法看起来是最简单的。

撰写回答