
Quería escribir una arara
regla 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í.:)
flag
solo 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 mycommand
en la directiva. Si no lo proporciona, @{mycommand}
estará vacío en la command
línea principal, donde se llama.
Si desea mycommand
ser evaluado independientemente de su aparición en una directiva, elija default
en 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 engine
argumento. El primer caso:
% arara: foo
arara
hará esto:
- Hay un
default
suceso, así que resuelvaengine
su evaluación. - No
engine
ocurre nada en la directiva, mantén las cosas como están.
Al final del día, engine
lo será pdflatex
. Ahora veamos el segundo caso:
% arara: foo: { engine: xelatex }
arara
ahora se comporta así:
- Hay un
default
suceso, así que resuelvaengine
su evaluación, que espdflatex
. - Hay una ocurrencia de
engine
en la directiva, evalúeflag
y reemplace el valor predeterminado.
Ahora, engine
lo 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!:)