2015-10-21 3 views
2

Я пишу 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') 

, и было бы хорошо, если бы я не должен повторить в точности ту же линию в начале обеих функций.

ответ

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

Немного, но я бы не стал считать его против вас, так как обычно вы хотите, чтобы переменные окружения были глобальными –

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