Passer le paramètre à la tâche Fabric

123

Comment puis-je passer un paramètre à une tâche de fabric lorsque j'appelle "fab" depuis la ligne de commande? Par exemple:

def task(something=''):
    print "You said %s" % something
$ fab task "hello"
You said hello

Done.

Est-il possible de faire cela sans demander avec fabric.operations.prompt?

Donovan
la source

Réponses:

207

Documentation des arguments de la tâche Fabric 2:

http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments


Fabric 1.X utilise la syntaxe suivante pour transmettre des arguments aux tâches:

 fab task:'hello world'
 fab task:something='hello'
 fab task:foo=99,bar=True
 fab task:foo,bar

Vous pouvez en savoir plus à ce sujet dans la documentation Fabric .

Jakub Roztocil
la source
9
Les citations ne sont pas nécessaires; tous les arguments sont des chaînes: "puisque ce processus implique une analyse de chaînes, toutes les valeurs finiront comme des chaînes Python, alors planifiez en conséquence. (Nous espérons améliorer cela dans les futures versions de Fabric, à condition qu'une syntaxe intuitive puisse être trouvée.)"
Carl G
4
Les citations hello worldsemblent nécessaires cependant?
PEZ
2
@PEZ Si c'est vrai, les guillemets sont probablement nécessaires dans cet exemple car l'analyseur de ligne de commande du terminal ou du fabric verrait l'espace et penserait que c'était la fin de tout pour cette tâche et que worldc'était une nouvelle tâche.
Adam Kerz
1
De plus, après l'avoir utilisé pendant moins d'une minute, j'ai constaté que, sous Windows, l'utilisation de guillemets simples entraîne la transmission des guillemets simples dans le cadre de l'argument, mais les guillemets doubles sont supprimés en premier. Donc, cela 'hello world'donnerait une chaîne Python de 'hello world', mais "hello world"aboutirait à hello world(ce qui est probablement ce que la plupart des gens voudraient).
Adam Kerz
5
Étant donné que le processus implique une analyse de chaîne, la bar=Truecommande en fabric sera transmise comme bar='True'n'étant pas une valeur booléenne
Programmeur chimique
7

Les arguments Fabric sont compris avec une analyse de chaîne très basique, vous devez donc être un peu prudent avec la façon dont vous les envoyez.

Voici quelques exemples de différentes manières de passer des arguments à la fonction de test suivante:

@task
def test(*args, **kwargs):
    print("args:", args)
    print("named args:", kwargs)

$ fab "test:hello world"
('args:', ('hello world',))
('named args:', {})

$ fab "test:hello,world"
('args:', ('hello', 'world'))
('named args:', {})

$ fab "test:message=hello world"
('args:', ())
('named args:', {'message': 'hello world'})

$ fab "test:message=message \= hello\, world"
('args:', ())
('named args:', {'message': 'message = hello, world'})

J'utilise des guillemets doubles ici pour retirer le shell de l'équation, mais les guillemets simples peuvent être meilleurs pour certaines plates-formes. Notez également les échappements pour les caractères que Fabric considère comme des délimiteurs.

Plus de détails dans la documentation: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments

Bogdan Kiselitsa
la source
7

Dans Fabric 2, ajoutez simplement l'argument à votre fonction de tâche. Par exemple, pour passer l' versionargument à la tâche deploy:

@task
def deploy(context, version):
    ...

Exécutez-le comme suit:

fab -H host deploy --version v1.2.3

Fabric documente même automatiquement les options:

$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]

Docstring:
  none

Options:
  -v STRING, --version=STRING
mrts
la source
existe-t-il un moyen de prédéfinir les hôtes dans la fonction elle-même? Similaire à la balise @roles () où nous pouvons définir une liste d'hôtes pour exécuter la tâche.
Anish
2

Vous devez transmettre toutes les variables Python sous forme de chaînes, en particulier si vous utilisez un sous-processus pour exécuter les scripts, sinon vous obtiendrez une erreur. Vous devrez reconvertir les variables en types int / booléen séparément.

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'
frage
la source
1

Si quelqu'un cherche à passer des paramètres d'une tâche à une autre dans fabric2, utilisez simplement le dictionnaire d'environnement pour cela:

@task
def qa(ctx):
  ctx.config.run.env['counter'] = 22
  ctx.config.run.env['conn'] = Connection('qa_host')

@task
def sign(ctx):
  print(ctx.config.run.env['counter'])
  conn = ctx.config.run.env['conn']
  conn.run('touch mike_was_here.txt')

Et courir:

fab2 qa sign
MikeL
la source