在面料中添加环境变量的最佳方法?
我想将结构中的一些值传递到远程环境中,而我没有看到一个很好的方法来实现它。目前为止最好的我是:在面料中添加环境变量的最佳方法?
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