我想將結構中的一些值傳遞到遠程環境中,而我沒有看到一個很好的方法來實現它。目前爲止最好的我是:在面料中添加環境變量的最佳方法?
with prefix('export FOO=BAR'):
run('env | grep BAR')
這似乎工作,但它似乎有點破解。
我查看了GIT存儲庫,看起來這是issue #263。
我想將結構中的一些值傳遞到遠程環境中,而我沒有看到一個很好的方法來實現它。目前爲止最好的我是:在面料中添加環境變量的最佳方法?
with prefix('export FOO=BAR'):
run('env | grep BAR')
這似乎工作,但它似乎有點破解。
我查看了GIT存儲庫,看起來這是issue #263。
我認爲您的prefix
爲基礎的解決方案是完全有效的。不過,如果你想有一個shell_env
上下文管理作爲issue#263提出的一個,你可以使用下面的另一種實現在你的工廠文件:
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
(見下面的示例輸出),而在issue#263提到的相互作用問題。shell_env
之前對env['shell']
進行任何更改。否則,shell_env
更改將被覆蓋,並且環境變量將無法用於您的命令。當執行上面的晶圓廠文件,你會得到以下輸出:
$ 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.context_managers.shell_env實現。 –
面料1.5.0(目前在GIT)採用外殼爲本地()命名的參數。 如果您傳遞'/ bin/bash',它將它傳遞給Popen的可執行參數。
它不會執行你的.bashrc,因爲.bashrc來源於bash的交互式調用。可以輸出你想要內部本地任意文件:
local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash')
面料1.5(釋放),fabric.context_managers.shell_env
你想要做什麼。
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
local("echo FOO1 is $FOO1")
在Windows上似乎不起作用。已添加支持,但它不在最新版本(1.6)中。 –
但是,在結構關閉連接之後變量會持續嗎?從文檔我明白,環境變量將被設置爲包裝命令只。 – glarrain
@glarrain是的,這就是他們實現它作爲上下文管理器的一點 – Anentropic
另一種方式是通過命令行與--set傳遞一個值:
--set=domain=stackoverflow.com
然後,你可以解決它在腳本env.domain
看到http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set
但是在結構關閉連接之後,變量是否會持續?從文檔('prefix'和'shell_env')我知道環境變量只會被設置爲包裝命令。 – glarrain