2014-04-12 15 views
10

In precedenza sono stato manualmente utilizzando un Makefile che sembrava qualcosa di simile:Reinstallare virtualenv con tox quando requirements.txt o setup.py cambia

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

Ciò ha avuto la bella effetto collaterale che, se ho cambiato requirements_dev.txt o setup.py, ricostruirà il mio virtualenv. Ma si sente un po 'goffo.

Mi piacerebbe usare tox per fare una cosa simile. Capisco che tox abbia un'opzione --recreate, ma preferisco chiamare lo solo quando è necessario.

La mia nuova configurazione è qualcosa di simile:

# Makefile 
.PHONY: all 
all: tests 

.PHONY: tests 
tests: 
    tox 

e

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

Una soluzione ideale sarebbe utilizzare solo le cose in tox, tuttavia una soluzione accettabile comporterebbe il Makefile e la bandiera --recreate.

+0

Voglio anche questa risposta. – bukzor

risposta

10

Sembra esserci un problema aperto in tox solo per questo problema.

https://github.com/tox-dev/tox/issues/149 (clicca e aggiungi il tuo commento e voto, rendendo consapevoli di quanto sia comune il problema è degli autori)

Dovremo o inviare una patch o di lavoro intorno ad esso. Soluzione che ti viene in mente:

  1. Elenco dipendenze direttamente nello tox.ini. Usa il tuo sistema di build per assicurarti che il tox.ini rimanga sincronizzato con lo requirements.txt.
  2. Aggiungi una regola al tuo Makefile che fa un tox --recreate ogni volta che cambia requirements.txt.

Soluzione 2 sembra la soluzione più semplice.

3

Ecco la soluzione Makefile ho finito per andare con:

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 

Esempio:

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

Deciso a risolvere questo, ho scritto un plugin Tox per raggiungere questo obiettivo: https://github.com/asottile/tox-pip-extensions

Il plugin si collega alla creazione di virtualenv e utilizza venv-update per mantenere le dipendenze sincronizzate.

L'utilizzo è piuttosto semplice:

  • installare tox-pip-extensions fianco tox (nel mio setup, ho un virtualenv a ~/venv con tox e tox-pip-extensions installato, e quindi un link simbolico ~/venv/bin/tox ->~/bin/tox)
  • abilitazione l'estensione come segue:

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