当前位置:  开发笔记 > 编程语言 > 正文

在Fabric中添加环境变量的最佳方法是什么?

如何解决《在Fabric中添加环境变量的最佳方法是什么?》经验,为你挑选了2个好方法。

我想将一些值从结构传递到远程环境,我没有看到一个很好的方法来做到这一点.到目前为止我提出的最好的是:

with prefix('export FOO=BAR'):
    run('env | grep BAR')

这似乎有效,但似乎有点像黑客.

我查看了GIT存储库,看起来这是问题#263.



1> Shanmu..:

从面料1.5(发布),fabric.context_managers.shell_env做你想要的.

    with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
        local("echo FOO1 is $FOO1")


在Windows上似乎不起作用。已添加支持,但最新版本(1.6)中未提供支持。

2> jcollado..:

我认为你prefix的解决方案是完全有效的.但是,如果您希望将shell_env上下文管理器设置为问题#263中提出的上下文管理器,则可以在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(参见下面的示例输出),而没有问题#263中提到的交互问题.

必须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.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有