如何编写 arara 规则来有条件地执行命令

如何编写 arara 规则来有条件地执行命令

我想编写一条arara规则,根据外部文件的存在有条件地执行命令。

以下是我能够运行的一个示例规则:

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

我还可以有条件地测试文件

!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: []

我想更改我正在执行的内容:即“/bin/echo”部分。但是当我尝试以下操作时:

!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 ") }

运行没有错误,但没有按照我想要的方式运行。

我也尝试过类似的事情:

!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 " }

这会产生错误

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 " }
                                         ^

我的测试文件(名为“example_01.tex”)如下所示:

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

从我发出的命令行

$ arara -v example_01.tex

记录的结果是:

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.

尽管我不太清楚该如何解释这一点。

所以基本上我想知道的是如何编写一条规则,该规则根据其他文件的存在而以不同的方式执行。

顺便说一句,我可以写:

!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: []

但我确实希望通过参数选择命令。

答案1

显然,同侪压力是有效的。:)我正在看着你,汤姆。:P

B 计划,看看我是否能获得 800 票: 我是 Facebook 的一名安全工程师,这是我的错。 :)

我可能应该专注于如何优化代码,但由于我很着急,所以现在我想不出直接的方法。:)

从本质上讲,引发的错误是命令开头使用的注意事项之一<arara>:我们可以保存一些引号,但可能会遇到来自 YAML 映射的一些问题。

YAML 格式大量使用该:字符,因此它在字符串中出现会导致解析器混淆,从而导致错误。解决方案是依靠老式的引号(单引号或双引号)。既然您已经有双引号,那就使用单引号:

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

现在它应该可以工作了。嗯,有点。:)

flag仅当参数出现在指令中时才会进行评估,否则参数将被解析为空字符串。为了进行此评估,您需要指令中包含的内容mycommand。如果不提供,则调用它的@{mycommand}主行中的内容将为空。command

如果你想要mycommand不管指令中是否出现都要进行求值,那么可以使用 fordefault而不是flag。让我们看一个例子:

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

假设我想要制定一条规则,在其中可以定义要使用哪个引擎,因此我有一个engine参数。第一种情况:

% arara: foo

arara将执行以下操作:

  1. 发生了某件事default,就去解决engine它的评估。
  2. 指令中没有engine出现任何情况,保持原样。

最终,engine将是pdflatex。现在我们来看第二种情况:

% arara: foo: { engine: xelatex }

arara现在的行为如下:

  1. 有一个default事件发生,因此解析engine其求值,即pdflatex
  2. engine指令中出现了,评估flag并替换默认值。

现在,engine将是xelatex:)

经过一些小修改,

!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 " }'

你的规则现在生效了。:)

希望能帮助到你!:)

相关内容