![如何编写 arara 规则来有条件地执行命令](https://linux22.com/image/281692/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%20arara%20%E8%A7%84%E5%88%99%E6%9D%A5%E6%9C%89%E6%9D%A1%E4%BB%B6%E5%9C%B0%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
我想编写一条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
将执行以下操作:
- 发生了某件事
default
,就去解决engine
它的评估。 - 指令中没有
engine
出现任何情况,保持原样。
最终,engine
将是pdflatex
。现在我们来看第二种情况:
% arara: foo: { engine: xelatex }
arara
现在的行为如下:
- 有一个
default
事件发生,因此解析engine
其求值,即pdflatex
。 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 " }'
你的规则现在生效了。:)
希望能帮助到你!:)