装饰器

fabfile 中可以方便使用的装饰器。

fabric.decorators.hosts(*host_list)

该装饰器用于指定被装饰的函数执行在那台主机或哪些主机列表上。

例如:如果不在控制台覆盖相关参数的话,将会在 host1host2 以及 host3 上执行 my_func,并且在 host1host3 上都指定了登录用户。

@hosts('user1@host1', 'host2', 'user2@host3')
def my_func():
    pass

hosts 接受 host 的参数列表(@hosts('host1'), @hosts('host1', 'host2'))或者一个 hosts 可迭代对象(@hosts(['host1', 'host2']))。

要注意,这个装饰器仅仅会设置函数的 .hosts 属性,which is then read prior to executing the function.

在 0.9.2 版更改: 可以接收一个可迭代对象作为唯一参数(@hosts(iterable)),不再要求这样写: @hosts(*iterable)

fabric.decorators.parallel(pool_size=None)

强制被装饰的函数并行执行而非同步执行。

该装饰器的优先级高于全局变量 env.parallel。如果函数还装饰了 serial 的话,依旧是它的优先级更高。

1.3 新版功能.

fabric.decorators.roles(*role_list)

该装饰器用于定义(服务器)“角色”名,然后用于寻找对应的主机列表。

角色是定义在 env 中的键,其对应的值是一个或多个主机连接字符穿的列表。例如:不考虑控制台参数覆盖的话,my_func 将会在 webserverdbserver 角色对应的主机列表上执行:

env.roledefs.update({
    'webserver': ['www1', 'www2'],
    'dbserver': ['db1']
})

@roles('webserver', 'dbserver')
def my_func():
    pass

hosts 一样, roles 也接受参数列表,或者单个可迭代对象作为参数,其实现机制是设置 <function>.roles,同样类似于 hosts

在 0.9.2 版更改: (和 hosts 一样)支持可迭代对象作为唯一参数。

fabric.decorators.runs_once(func)

阻止函数多次执行的装饰器。

通过保存内部状态,使用该装饰器可以保证函数在每个 Python 解释器中只运行一次,通常在使用时它的作用都是“每个 fab 程序生命周期中只运行一次”。

任何被该装饰器装饰的函数在第二次、第三次……第 n 次执行时都会静默失败,并返回初次运行的结果。

注解

runs_once 无法和任务并行执行同时生效。

fabric.decorators.serial(func)

强制被装饰的函数顺序执行,不并行执行。

该装饰器效果的优先级高于全局变量 env.parallel。如果任务同时被 serial parallel 装饰器装饰,parallel 的优先级更高。

1.3 新版功能.

fabric.decorators.task(*args, **kwargs)

将函数封装为新式任务的装饰器。

可以作为简单的、无参数的装饰器使用(@task 这样),也可以使用参数修订其行为(比如: @task(alias='myalias'))。

关于 new-style task 装饰器的使用请参见其文档。

在 1.2 版更改: 新增关键字参数 aliasaliasestask_classdefault。详情参见 参数

在 1.5 版更改: 新增关键字参数 name

参见

~fabric.docs.unwrap_tasks`、 WrappedCallableTask

fabric.decorators.with_settings(*arg_settings, **kw_settings)

一个装饰器,作用等价于 fabric.context_managers.settings

将整个函数封装起来,其效果类似于执行在 settings 上下文管理器中。如果你想要修改函数的设置,但不愿改动其缩进时,它会很有用。

例如:将整个任务函数中的退出(abort)转换为警告:

@with_settings(warn_only=True)
def foo():
    ...

参见

settings

1.1 新版功能.