2

每次调用我都需要在 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 机制。也许每次 Fabric 运行都会调用一些隐含的“设置”任务或方法?

此外,实际上还有更多 FOO 设置(总共 10 个),是否有在找不到任务时调用的通用任务/方法?像一个包罗万象的东西,比如:

def catchall(name, *args, **kwargs):
    if name in ['one', 'two', ...]:
        env['FOO'] = name
4

1 回答 1

1

您可以使您的任务成为具有作为参数传递的某些属性的自定义类的子类:

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))
于 2013-05-20T15:08:22.360 回答