每次调用我都需要在 Fabric 中设置一些环境变量,到目前为止我正在做类似的事情:
env['FOO'] = 'one'
@task
def one():
env['FOO'] = 'one'
print(cyan('Using FOO %s' % env['FOO']))
@task
def two():
env['FOO'] = 'two'
print(cyan('Using FOO %s' % env['FOO']))
@task
def run():
with shell_env(FOO=env['FOO']):
local(...)
# more tasks that have the same pattern as run() above
首先,我想提供一种更好的机制来自动设置 FOO,如果既没有调用“one”也没有调用“two”。也许每次 Fabric 运行时都会调用一些隐式的“设置”任务或方法?
此外,实际上还有更多的 FOO 设置(总共 10 个),是否有找不到任务时调用的通用任务/方法?像一个包罗万象的东西,比如:
def catchall(name, *args, **kwargs):
if name in ['one', 'two', ...]:
env['FOO'] = name
请您参考如下方法:
您可以使您的任务成为具有作为参数传递的特定属性的自定义类的子类:
from fabric.api import task
from fabric.tasks import Task
class CustomTask(Task):
def __init__(self, func, *args, **kwargs):
super(CustomTask, self).__init__(*args, **kwargs)
self.func = func
self.foo = "one"
def run(self, *args, **kwargs):
return self.func(self.foo, *args, **kwargs)
@task(task_class=CustomTask)
def one(foo):
print(cyan('Using FOO %s' % foo))
