Création de virtualenvs préconfigurés hors-ligne

Posté le 05 March 2013 dans Python

Je crée régulièrement des virtualenvs avec virtualenvwrapper, et j’ai toujours les mêmes problèmes:

  • il faut installer les mêmes outils de base à chaque fois
  • il faut être connecté pour les télécharger
  • le téléchargement peut être long

mkvirtualenv propose un hook, postmkvirtualenv, qui permet d’exécuter des commandes après la création du virtualenv.

Je l’utilise pour lancer l’installation de dépendances communes à tous mes virtualenvs. Couplé avec la recette Fast & Local Installs de pip, cela me permet de créer des virtualenvs préconfigurés totalement hors-ligne.

Pour cela, on va créer le répertoire $WORKON_HOME/offline et le fichier de requirement $WORKON_HOME/mkvirtualenv.pip:

~$ mkdir $WORKON_HOME/offline
~$ cat $WORKON_HOME/mkvirtualenv.pip
pep8
sphinx
ipdb
ipython
grin

Pour pouvoir instancier les virtualenvs sans connection, on va télécharger les paquets dans $WORKON_HOME/offline:

pip install --download $WORKON_HOME/offline -r $WORKON_HOME/mkvirtualenv.pip

Il suffit maintenant d’éditer le fichier $WORKON_HOME/postmkvirtualenv pour effectuer l’installer des paquets à chaque création de virtualenv:

#!/bin/bash
# This hook is run after a new virtualenv is activated.
pip install --no-index --find-links=file://$WORKON_HOME/offline -r $WORKON_HOME/mkvirtualenv.pip

Maintenant à la création de chaque virtualenv, mes outils sont installés rapidement, plus de connection nécéssaire, plus de temps de téléchargement…

Il est possible d’utiliser cette technique pour créer des templates très simples. Par exemple, pour installer rapidement un environnement Django dans un virtualenv:

~$ cat $WORKON_HOME/mkdjango.pip
django
django-jenkins
django.js
django-braces
django-pipeline
south
pillow
pytz
~$ cat $WORKON_HOME/mkdjango
#!/bin/bash
pip install --no-index --find-links=file://$WORKON_HOME/offline -r $WORKON_HOME/mkdjango.pip

Téléchargement des dépendances Django:

pip install --download $WORKON_HOME/offline -r $WORKON_HOME/mkdjango.pip

Installation de Django dans un virtualenv existant et actif:

(myvenv)~/workspace$ $WORKON_HOME/mkdjango

De la même façon, pour Fabric et Fabtools:

~$ cat $WORKON_HOME/mkfabric.pip
fabric
fabtools
~$ cat $WORKON_HOME/mkfabric
#!/bin/bash
pip install --no-index --find-links=file://$WORKON_HOME/offline -r $WORKON_HOME/mkfabric.pip

J’espère que cette technique vous sera aussi utile qu’à moi!