Fabric全局设置环境变量

时间:2015-10-21 12:02:29

标签: python fabric

我正在编写一个fabfile,我想要为我用于开发的virtualenv包含一个环境变量。我不想放

with shell_env(venv=VIRTUALENV):
    ...

在每一个功能中。我希望能够在文件的开头添加它,并将其应用于全局的所有任务。有没有办法做到这一点?

例如,我有任务

def setup_dev_env():
    with shell_env(venv=VIRTUALENV):
        local('virtualenv $(venv)')
        with prefix('workon $(venv)'):
            local('pip install -r requirements.txt')
        test()

def test():
    with shell_env(venv=VIRTUALENV):
        with prefix('workon $(vnenv)'):
            local('python3 manage.py test')

如果我不必在两个函数的开头重复完全相同的行,那就太好了。

2 个答案:

答案 0 :(得分:2)

我不确定这是否被认为是command_prefixes的黑客,但它有效:

env.command_prefixes=["export myvar='Hello world'",]
def echo_env():
    run(r"echo $myvar")

输出:

C:\Users\swozn\PycharmProjects\aaetuea>fab echo_env
[swozn@localhost] Executing task 'echo_env'
[swozn@localhost] run: echo $myvar
[swozn@localhost] out: Hello world

优点是不可能忘记,因为它会自动添加到你的所有命令之前。

答案 1 :(得分:1)

如果你看prefix()shell_env() - 你会注意到他们只是使用_setenv({..})你可以将所有内容与settings()结合起来并将其放在一个函数中它曾经或只是将它全部放在一行......由你决定。

https://github.com/fabric/fabric/blob/5217b12f8aca3bc071206f7f4168e62c003509d1/fabric/context_managers.py#L370

https://github.com/fabric/fabric/blob/5217b12f8aca3bc071206f7f4168e62c003509d1/fabric/context_managers.py#L160

https://github.com/fabric/fabric/blob/5217b12f8aca3bc071206f7f4168e62c003509d1/fabric/context_managers.py#L443

如果看起来像:

def setup_dev_env():
    with settings(..all your options..):
        local(..your command...)

或者如果你真的想变得很酷:

@with_settings(..all your same options from before..)
def setup_dev_env():
   local(..command..)