J'aimerais transmettre quelques valeurs de fabric à l'environnement distant, et je ne vois pas comment le faire. Le meilleur que j'ai trouvé jusqu'ici est:
with prefix('export FOO=BAR'):
run('env | grep BAR')
Cela semble fonctionner, mais cela semble être un peu un bidouillage.
J'ai regardé dans le référentiel GIT et il semble que ceci soit numéro # 263 .
À partir de Fabric 1.5 (publié), fabric.context_managers.Shell_env
fait ce que vous voulez.
with Shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
local("echo FOO1 is $FOO1")
Je pense que votre solution basée sur prefix
est parfaitement valide. Toutefois, si vous souhaitez utiliser un gestionnaire de contexte Shell_env
identique à celui proposé dans numéro n ° 263 , vous pouvez utiliser l'implémentation alternative suivante dans vos fichiers fab:
from fabric.api import run, env, prefix
from contextlib import contextmanager
@contextmanager
def Shell_env(**env_vars):
orig_Shell = env['Shell']
env_vars_str = ' '.join('{0}={1}'.format(key, value)
for key, value in env_vars.items())
env['Shell']='{0} {1}'.format(env_vars_str, orig_Shell)
yield
env['Shell']= orig_Shell
def my_task():
with prefix('echo FOO1=$FOO1, FOO2=$FOO2, FOO3=$FOO3'):
with Shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
run('env | grep BAR')
Notez que ce gestionnaire de contexte modifie env['Shell']
au lieu de env['command_prefixes']
(comme le gestionnaire de contexte prefix
), de sorte que vous:
prefix
(voir l’exemple ci-dessous) sans les problèmes d’interaction mentionnés dans issue # 263 .env['Shell']
avant d'utiliser Shell_env
. Sinon, les modifications de Shell_env
seront écrasées et les variables d'environnement ne seront pas disponibles pour vos commandes.Lors de l'exécution du fichier fab ci-dessus, vous obtenez le résultat suivant:
$ fab -H localhost my_task
[localhost] Executing task 'my_task'
[localhost] run: env | grep BAR
[localhost] out: FOO1=BAR1, FOO2=BAR2, FOO3=BAR3
[localhost] out: FOO1=BAR1
[localhost] out: FOO2=BAR2
[localhost] out: FOO3=BAR3
[localhost] out:
Done.
Disconnecting from localhost... done.
Fabric 1.5.0 (actuellement dans Git) prend Shell comme argument local () nommé . Si vous passez '/ bin/bash' ici, il le passe à l'argument exécutable de Popen.
Cependant, il n'exécutera pas votre fichier .bashrc car celui-ci provient d'un appel interactif de bash. Vous pouvez rechercher n'importe quel fichier dans le répertoire local:
local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', Shell='/bin/bash')
Essayez d'utiliser un décorateur
from fabric.context_managers import Shell_env
from functools import wraps
def set_env():
def decorator(func):
@wraps(func)
def inner(*args, **kwargs):
with Shell_env(Django_CONFIGURATION=env.config):
run("echo $Django_CONFIGURATION")
return func(*args, **kwargs)
return inner
return decorator
@task
@set_env()
def testme():
pass
Une autre méthode consiste à transmettre une valeur via la ligne de commande avec --set:
--set=domain=stackoverflow.com
Ensuite, vous pouvez vous y adresser dans le script avec env.domain
voir http://docs.fabfile.org/fr/1.11.11/usage/fab.html#cmdoption--set