在requirements.txt或setup.py更改时,使用tox重新安装virtualenv

时间:2014-04-12 15:45:54

标签: python makefile virtualenv tox

以前我手动使用看起来像这样的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标记。

3 个答案:

答案 0 :(得分:10)

对于这个问题,tox似乎存在一个未解决的问题。

https://github.com/tox-dev/tox/issues/149(点击并添加评论和投票,让作者了解问题的常见程度)

我们需要提交补丁或解决问题。想到的解决方法:

  1. 直接在tox.ini中列出依赖关系。使用您的构建系统确保tox.ini与requirements.txt保持同步。
  2. 在您的Makefile中添加一个执行tox的规则 - 每当requirements.txt发生更改时都会重新创建。
  3. 解决方法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