web-dev-qa-db-fra.com

Passer le paramètre à la tâche de matrice

Comment puis-je passer un paramètre à une tâche de structure 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?

116
Donovan

Documentation sur les 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 les 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 Fabric docs .

199
Jakub

Les arguments de structure sont compris dans l'analyse de base des chaînes, 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 les guillemets doubles ici pour éliminer Shell de l'équation, mais les guillemets simples peuvent être meilleurs pour certaines plates-formes. Notez également les échappements pour les caractères que la structure considère comme des délimiteurs.

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

3
Bogdan Kiselitsa

Vous devez transmettre toutes les variables Python sous forme de chaînes, surtout si vous utilisez un sous-processus pour exécuter les scripts, sinon vous obtiendrez une erreur. Vous devrez reconvertir les variables en types int/boolean 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'
2
frage

Si quelqu'un cherche à passer des paramètres d'une tâche à une autre dans fabric2, utilisez simplement le dictionnaire de l'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
0
MikeL

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

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

Exécutez-le comme suit:

fab -H Host deploy --version v1.2.3

Fabric même documente les options automatiquement:

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

Docstring:
  none

Options:
  -v STRING, --version=STRING
0
mrts