2015-10-21 51 views
2

我寫,我想包括我使用的發展virtualenv中的環境變量fabfile。我不想把面料設置的環境變量全球

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') 

,如果我沒有在這兩者的功能開始重複一模一樣的行這將是很好。

回答

1

我不知道,如果這被認爲是command_prefixes一個黑客,但它的工作原理:

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

輸出:

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

的優點是,它是不可能忘記的,因爲它是自動作爲所有命令的前綴。

+0

了一點,但我wouldnt指望它反對你因爲通常你想的環境變量是全球性的 –

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..)