Pasar parámetro a tarea tarea

¿Cómo puedo pasar un parámetro a una tarea de estructura al llamar “fab” desde la línea de comandos? Por ejemplo:

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

¿Es posible hacer esto sin fabric.operations.prompt con fabric.operations.prompt ?

Documentación de los argumentos de la tarea de Fabric 2:

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


Fabric 1.X usa la siguiente syntax para pasar argumentos a las tareas:

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

Puedes leer más sobre esto en los documentos de Fabric .

Los argumentos de la estructura se entienden con un análisis de cadena muy básico, por lo que debe ser un poco cuidadoso con la forma en que los envía.

Aquí hay algunos ejemplos de diferentes maneras de pasar argumentos a la siguiente función de prueba:

 @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'}) 

Utilizo comillas dobles aquí para eliminar el shell de la ecuación, pero las comillas simples pueden ser mejores para algunas plataformas. También tenga en cuenta los escapes para los personajes que la tela considera delimitadores.

Más detalles en los documentos: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments

Debe pasar todas las variables de Python como cadenas, especialmente si está usando un subproceso para ejecutar los scripts, o recibirá un error. Deberá volver a convertir las variables a tipos int / boolean por separado.

 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 alguien está buscando pasar parámetros de una tarea a otra en fabric2, solo use el diccionario de entorno para eso:

 @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') 

Y correr:

 fab2 qa sign 

En Fabric 2, simplemente agregue el argumento a su función de tarea. Por ejemplo, para pasar el argumento de la version a la tarea de deploy :

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

Ejecutarlo de la siguiente manera:

 fab -H host deploy --version v1.2.3 

Fabric incluso documenta las opciones automáticamente:

 $ fab --help deploy Usage: fab [--core-opts] deploy [--options] [other tasks here ...] Docstring: none Options: -v STRING, --version=STRING