Как написать правило 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

План Б: посмотрим, наберу ли я 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сделаем это:

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

Ваше правило теперь работает.:)

Надеюсь, поможет!:)

Связанный контент