
Я хотел написать 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
План Б: посмотрим, наберу ли я 800 голосов: Я инженер по безопасности в Facebook, и это моя вина. :)
Вероятно, мне следует сосредоточиться на оптимизации кода, но поскольку я спешу, я не могу сейчас придумать прямой подход.:)
Возникающая ошибка, по сути, является одним из предостережений использования <arara>
в начале команды: мы можем сэкономить несколько кавычек, но можем столкнуться с некоторыми проблемами, связанными с отображением YAML.
Символ :
активно используется форматом YAML, и поэтому его появление в строке позже приводит к путанице анализатора, отсюда и ошибка. Решение — положиться на старые добрые кавычки (одинарные или двойные). Поскольку у вас уже есть двойные кавычки, используйте одинарные:
flag: '@{ isFile ("./dir/file") == true ? "/bin/echo " : "/bin/ls " }'
Теперь должно работать. Ну, вроде того.:)
flag
оценивается только если аргумент представлен в директиве, в противном случае аргумент будет разрешен в пустую строку. Для того чтобы эта оценка произошла, выиметьиметь mycommand
в директиве. Если вы не предоставите его, @{mycommand}
будет пустым в основной command
строке, где он вызывается.
Если вы хотите, mycommand
чтобы вас оценивали независимо от его появления в директиве, используйте default
вместо 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 " }'
Ваше правило теперь работает.:)
Надеюсь, поможет!:)