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
?
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 .
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
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'
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
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