2014-04-12 8 views
10

Früher war ich manuell ein Makefile verwenden, das in etwa so aussah:Installieren virtualenv mit tox wenn requirements.txt oder setup.py ändert

.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' 

Dies den schönen Nebeneffekt hatte, dass, wenn ich geändert requirements_dev.txt oder setup.py, es würde mein virtualenv wiederherstellen. Aber fühlt sich ein bisschen klobig an.

Ich möchte tox verwenden, um eine ähnliche Sache zu tun. Ich verstehe, tox hat eine --recreate Option, aber ich würde eher anrufen, dass nur wenn ich muss.

Mein neues Setup ist so etwas wie folgt aus:

# Makefile 
.PHONY: all 
all: tests 

.PHONY: tests 
tests: 
    tox 

und

# 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} 

Eine ideale Lösung würde die Dinge nur in tox verwenden, aber eine akzeptable Lösung würde das Makefile und die --recreate Flagge einbeziehen.

+0

Ich möchte diese Antwort auch. – bukzor

Antwort

10

Es scheint ein offenes Problem in tox nur für dieses Problem zu sein.

https://github.com/tox-dev/tox/issues/149 (klicken und Ihre Kommentare und Stimme hinzufügen, die Autoren machen sich bewusst darüber, wie häufig das Problem ist)

Wir brauchen entweder einen Patch oder Arbeit um ihn herum vor. Abhilfe:

  1. Listen Sie Abhängigkeiten direkt in tox.ini auf. Verwenden Sie Ihr Build-System, um sicherzustellen, dass die tox.ini mit der requirements.txt synchronisiert bleibt.
  2. Fügen Sie Ihrem Makefile eine Regel hinzu, die eine tox --recreate ausführt, wenn sich die requirements.txt ändert.

Problemumgehung 2 scheint am einfachsten.

3

Hier ist die Makefile Abhilfe, die ich mit dem Gehen endete:

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 

Beispiel:

$ make tests 
touch .venv.touch 
tox --recreate 
[[ SNIP ]] 
$ make tests 
tox 
[[ SNIP ]] 
$ touch requirements.txt 
$ make tests 
touch .venv.touch 
tox --recreate 
[[ SNIP ]] 
0

fest entschlossen, diese zu lösen, habe ich ein tox Plugin geschrieben, dies zu erreichen: https://github.com/asottile/tox-pip-extensions

Das Plugin verbindet sich mit der Virtualenv-Erstellung und verwendet venv-update, um Abhängigkeiten synchron zu halten.

Die Benutzung ist ziemlich einfach:

  • tox-pip-extensions neben tox installieren (in meinem Setup, ich habe eine virtualenv bei ~/venv mit tox und tox-pip-extensions installiert und Symlink dann ~/venv/bin/tox ->~/bin/tox)
  • ermöglichen die Erweiterung wie folgt:

    [tox] 
    tox_pip_extensions_ext_venv_update = true 
    # the rest of your tox.ini file as normal... 
    
Verwandte Themen