
Eu queria escrever uma arara
regra que executasse condicionalmente um comando com base na existência de arquivos externos.
Aqui está um exemplo de regra que consegui fazer funcionar:
!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: echo
name: echo
command: /bin/echo "-->@{getBasename(file)}<--"
arguments: []
Também posso testar condicionalmente um arquivo
!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: []
Gostaria de mudar o que estou executando: ou seja, a parte "/bin/echo". Mas quando tento 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 ") }
Isso é executado sem erros, mas não faz o que eu quero.
Eu também tentei 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 " }
Isso gera um erro
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 " }
^
Meu arquivo de teste (chamado "example_01.tex") se parece com:
% arara: test: { files: [example_01.tex] }
na linha de comando que estou emitindo
$ arara -v example_01.tex
O resultado do registro é:
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.
embora eu não tenha muita certeza de como interpretar isso.
Então, basicamente, o que eu gostaria de saber é como escrever uma regra que seja executada de maneira diferente, dependendo da existência de algum outro arquivo.
Aliás, posso escrever:
!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: []
Mas eu realmente queria que os comandos fossem escolhidos através dos argumentos.
Responder1
Aparentemente, a pressão dos colegas funciona. :)
Estou olhando para você, Tom.:P
Plano B, vamos ver se consigo 800 votos: Sou engenheiro de segurança no Facebook e a culpa é minha. :)
Eu provavelmente deveria me concentrar em como otimizar o código, mas como estou com pressa, não consigo pensar em uma abordagem direta agora.:)
O erro levantado é, nos bastidores , uma das advertências de uso <arara>
no início de um comando: podemos salvar algumas aspas, mas podemos encontrar alguns problemas provenientes do mapeamento YAML.
O :
caractere é muito usado pelo formato YAML e, portanto, sua ocorrência posteriormente na string faz com que o analisador fique confuso, daí o erro. A solução é contar com as boas e velhas cotações (simples ou duplas). Como você já tem aspas duplas, opte pelas simples:
flag: '@{ isFile ("./dir/file") == true ? "/bin/echo " : "/bin/ls " }'
Agora deve funcionar. Bem, tipo isso.:)
flag
só é avaliado se o argumento for apresentado na diretiva, caso contrário o argumento será resolvido para uma string vazia. Para que essa avaliação aconteça, vocêterter mycommand
na directiva. Se você não fornecer, @{mycommand}
ficará vazio na command
linha principal, onde é chamado.
Se você deseja mycommand
ser avaliado independentemente de sua ocorrência em uma diretiva, opte default
por flag
. Vejamos um exemplo:
- identifier: engine
flag: <arara> @{parameters.engine}
default: pdflatex
Digamos que eu queira ter uma regra na qual eu possa definir qual motor quero usar, então tenho um engine
argumento. O primeiro caso:
% arara: foo
arara
fará isso:
- Há uma
default
ocorrência, então decidaengine
avaliá-la. - Nenhuma
engine
ocorrência na diretriz, mantenha as coisas como estão.
No final do dia, engine
será pdflatex
. Agora vamos ver o segundo caso:
% arara: foo: { engine: xelatex }
arara
agora se comporta assim:
- Há uma
default
ocorrência, então resolvaengine
sua avaliação, que épdflatex
. - Há uma ocorrência
engine
na diretiva, avalieflag
e substitua o valor padrão.
Agora, engine
será xelatex
.:)
Com algumas pequenas edições,
!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 " }'
sua regra agora funciona.:)
Espero que ajude!:)