2013-06-20 8 views
5

Nun, ich muss zugeben, ich bin neu in Fabric und sogar Python, aber ich bin daran interessiert, es richtig zu machen, also ... Ich möchte einige meiner schmücken Aufgaben mit einer prepare Funktion, die einige vars zu env abhängig von denen bereits gegeben hinzufügt. Werfen Sie einen Blick:Wie man einen benutzerdefinierten Dekorator zu einer Fabric-Aufgabe hinzufügt

from fabric.api import * 
import fabstork.project.base as base 
import fabstork.utils.drupal as utils 

def prepare(task): 
    """ Decorator to set some additional environment variables """ 
    def prepared(*args, **kwargs): 
     env.sites_folder = env.sites_folder if 'sites_folder' in env else 'default' 
     env.settings_file = "%s/www/sites/%s/settings.php" % (env.build_path, env.sites_folder) 
     # more to come 
     return task(*args, **kwargs) 

    return prepared 


@task 
@prepare 
def push(ref='HEAD'): 
    """ 
    Deploy a commit to a host 
    """ 
    base.push(ref) 
    utils.settings_php() 
    utils.link_files() 
    utils.set_perms() 

Das obige Beispiel nicht für die push keine Aufgabe mehr ist, es ist nicht in der Liste der verfügbaren Aufgaben, wenn ein fab --list in der Befehlszeile zu tun. Das Weglassen des Dekorators führt zu einer perfekten Aufgabe. Was mache ich falsch?

Antwort

8
from fabric.decorators import task 
from functools import wraps 

def custom_decorator(func): 
    @wraps(func) 
    def decorated(*args, **kwargs): 
     print "this function is decorated." 
     return func(*args, **kwargs) 
    return decorated 

@task 
@custom_decorator 
def some_function(): 
    print "this is function" 

Ergebnis:

# fab -l 
>Available commands: 
> 
> some_function 

# fab some_function 
>this function is decorated. 
>this is function 
> 
>Done. 
+1

Dank! Also verpasste ich im Grunde ** @ Wraps (func) **. Könnten Sie Ihre Antwort aktualisieren, um darauf hinzuweisen? – aaki

Verwandte Themen