2013-05-20 19 views
2

有我需要的面料每次調用和喜歡到目前爲止我做一些設置一些環境變量:在python 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 

回答

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)) 
+0

很奇怪,但由於某種原因,自定義任務如果我將自定義任務繼承的任務指定爲fab的參數,則會隱式地加倍調用 – stgtscc