ファブリックからリモート環境にいくつかの値を渡したいのですが、それを行うための素晴らしい方法が見当たりません。これまでに思いついた最高のものは:
with prefix('export FOO=BAR'):
run('env | grep BAR')
これは機能しているように見えますが、ちょっとしたハッキングのようです。
GITリポジトリを調べたところ、これは issue#26 のように見えます。
Fabric 1.5(リリース済み)以降、 fabric.context_managers.Shell_env
はあなたが望むことをします。
with Shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
local("echo FOO1 is $FOO1")
prefix
ベースのソリューションは完全に有効だと思います。ただし、 issue#26 で提案されているShell_env
コンテキストマネージャーが必要な場合は、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')
このコンテキストマネージャーはenv['Shell']
の代わりにenv['command_prefixes']
を変更することに注意してください(prefix
コンテキストマネージャーが行うように)。
prefix
を使用できます(以下の出力例を参照)。env['Shell']
を使用する前に、Shell_env
に変更を適用する必要があります。そうしないと、Shell_env
の変更が上書きされ、コマンドで環境変数を使用できなくなります。上記のfabファイルを実行すると、次の出力が得られます。
$ 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(現在Gitにあります)は、シェルをlocal()名前付き引数として使用します。 '/ bin/bash'を渡すと、Popenの実行可能な引数に渡します。
ただし、.bashrcはbashのインタラクティブな呼び出しに基づいているため、.bashrcは実行されません。ローカル内で必要なファイルをソースできます。
local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', Shell='/bin/bash')
デコレータを使用してみてください
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
別の方法は、コマンドラインで--setを使用して値を渡すことです。
--set=domain=stackoverflow.com
次に、env.domainを使用してスクリプトでアドレス指定できます
http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set を参照してください