我正在编写一个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')
,如果我不必在两个函数的开头重复完全相同的行就好了。
我不确定这是否被认为是对command_prefixes
的攻击,但它有效:
env.command_prefixes=["export myvar='Hello world'",]
def echo_env():
run(r"echo $myvar")
输出:C:UsersswoznPycharmProjectsaaetuea>fab echo_env
[swozn@localhost] Executing task 'echo_env'
[swozn@localhost] run: echo $myvar
[swozn@localhost] out: Hello world
如果你看看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
if看起来像这样:
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..)