如何在Fabric中混合@task和@runs_once装饰器?
我有一个任务(check_for_updates),用于检查每个主机上安装的Python包,并记录哪些需要更新。然后,我有一个任务(report_pending_updates),显示一个报告,显示哪些主机需要更新。所以我在做:
fab production check_for_updates report_pending_updates
但是,由于我有多台主机,它会为每台主机运行report_pending_updates,多次显示该报告。
我尝试过构建我的任务:
@runs_once
@task
def report_pending_updates():
...
但这会导致Fabric无法检测到该任务。切换装饰器顺序会导致同样的问题。
答案 0 :(得分:1)
首先放置@task,否则它将无法识别它。至于runs_once,你是否并行运行它,它不会在forks中共享这个runs_once状态?
如果是这样或类似的话,你应该考虑使用execute()来处理这项工作。更像是这样:
def report_pending_updates():
execute(check_for_updates, hosts=hosts)
#everything else
...