¿Cómo escribo una regla arara para ejecutar condicionalmente un comando?

¿Cómo escribo una regla arara para ejecutar condicionalmente un comando?

Quería escribir una arararegla que ejecutara condicionalmente un comando según la existencia de archivos externos.

Aquí hay una regla de ejemplo que pude hacer funcionar:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: echo
name: echo
command: /bin/echo "-->@{getBasename(file)}<--"
arguments: []

También puedo probar condicionalmente un archivo.

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> /bin/echo @{ isTrue ( isFile ("./dir/file") , "TRUE" , "FALSE") }
arguments: []

Me gustaría cambiar lo que estoy ejecutando: es decir, la parte "/bin/echo". Pero cuando intento algo como:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> @{mycommand} @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: 
  - identifier: mycommand
    flag: <arara> @{ isTrue ( isFile ("./dir/file") , "/bin/echo " , "/bin/ls ") }

Esto se ejecuta sin errores, pero no hace lo que quiero.

También probé algo como:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> @{mycommand} @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: 
  - identifier: mycommand
    flag: <arara> @{ isFile ("./dir/file") == true  ?  "/bin/echo " : "/bin/ls " }

Esto genera un error

It appears that the 'test' task has a YAML syntax error or an
invalid field. Could you take a look at the 'test.yaml' file
located at '/Users/acellett/projects/ini/arara/rules'. I tried my
best to dump the error message, so here it is:

Problem: mapping values are not allowed here
Error found in line 12, column 60.
     ... ("./dir/file")  ?  "/bin/echo " : "/bin/ls " }
                                         ^

Mi archivo de prueba (llamado "example_01.tex") tiene este aspecto:

%  arara: test: { files: [example_01.tex] }

desde la línea de comando que estoy emitiendo

$ arara -v example_01.tex

El resultado del registro es:

01 Jan 2014 10:58:59.870 INFO  Arara - Welcome to arara!
01 Jan 2014 10:58:59.874 INFO  Arara - Processing file 'example_01.tex', please wait.
01 Jan 2014 10:58:59.875 INFO  DirectiveExtractor - Reading directives from example_01.tex.
01 Jan 2014 10:58:59.876 TRACE DirectiveExtractor - Directive found in line 1 with test: { files: [example_01.tex] }.
01 Jan 2014 10:58:59.884 INFO  DirectiveParser - Parsing directives.
01 Jan 2014 10:58:59.889 INFO  TaskDeployer - Deploying tasks into commands.
01 Jan 2014 10:58:59.889 TRACE TaskDeployer - Task 'test' found in '/Users/acellett/projects/ini/arara/rules'.
01 Jan 2014 10:58:59.933 INFO  CommandTrigger - Ready to run commands.
01 Jan 2014 10:58:59.934 INFO  CommandTrigger - Running 'testing'.
01 Jan 2014 10:58:59.934 TRACE CommandTrigger - Command:  TRUE
01 Jan 2014 10:59:00.063 TRACE CommandTrigger - Output logging:
01 Jan 2014 10:59:00.064 TRACE CommandTrigger - 
01 Jan 2014 10:59:00.064 INFO  CommandTrigger - 'testing' was successfully executed.
01 Jan 2014 10:59:00.064 INFO  CommandTrigger - All commands were successfully executed.
01 Jan 2014 10:59:00.065 INFO  Arara - Done.

aunque no estoy muy seguro de cómo interpretar esto.

Básicamente, lo que me gustaría saber es cómo escribir una regla que se ejecute de manera diferente dependiendo de la existencia de algún otro archivo.

Por cierto, puedo escribir:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> @{ isTrue ( isFile ("./dir/file") , "/bin/echo " , "/bin/ls ") } @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: []

Pero realmente quería que los comandos se eligieran a través de los argumentos.

Respuesta1

Al parecer, la presión de grupo funciona. :)Te estoy mirando, Tom.:P

Plan B, a ver si consigo 800 votos: Soy ingeniero de seguridad en Facebook y esto es culpa mía. :)

Probablemente debería concentrarme en cómo optimizar el código, pero como tengo prisa, no puedo pensar en un enfoque directo en este momento.:)

El error planteado es, bajo el mar , una de las advertencias del uso <arara>al comienzo de un comando: podemos guardar algunas comillas, pero podemos encontrarnos con algunos problemas provenientes del mapeo YAML.

:El formato YAML utiliza mucho el carácter y, por lo tanto, su aparición más adelante en la cadena hace que el analizador se confunda, de ahí el error. La solución es confiar en las viejas comillas (simples o dobles). Como ya tienes comillas dobles, elige las simples:

flag: '@{ isFile ("./dir/file") == true  ?  "/bin/echo " : "/bin/ls " }'

Ahora debería funcionar. Bueno, algo así.:)

flagsolo se evalúa si el argumento se presenta en la directiva; de lo contrario, el argumento se resolverá en una cadena vacía. Para que esta evaluación se realice, ustedtenertener mycommanden la directiva. Si no lo proporciona, @{mycommand}estará vacío en la commandlínea principal, donde se llama.

Si desea mycommandser evaluado independientemente de su aparición en una directiva, elija defaulten lugar de flag. Veamos un ejemplo:

- identifier: engine
  flag: <arara> @{parameters.engine}
  default: pdflatex

Digamos que quiero tener una regla en la que pueda definir qué motor quiero usar, así que tengo un engineargumento. El primer caso:

% arara: foo

ararahará esto:

  1. Hay un defaultsuceso, así que resuelva enginesu evaluación.
  2. No engineocurre nada en la directiva, mantén las cosas como están.

Al final del día, enginelo será pdflatex. Ahora veamos el segundo caso:

% arara: foo: { engine: xelatex }

araraahora se comporta así:

  1. Hay un defaultsuceso, así que resuelva enginesu evaluación, que es pdflatex.
  2. Hay una ocurrencia de engineen la directiva, evalúe flagy reemplace el valor predeterminado.

Ahora, enginelo será xelatex.:)

Con algunas ediciones menores,

!config
identifier: test
name: testing
commands: 
  - <arara> @{mycommand} @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: 
  - identifier: mycommand
    default: '@{ isFile ("./dir/file") == true  ?  "/bin/echo " : "/bin/ls " }'

tu regla ahora funciona.:)

¡Espero eso ayude!:)

información relacionada