Wie schreibe ich eine Arara-Regel, um einen Befehl bedingt auszuführen?

Wie schreibe ich eine Arara-Regel, um einen Befehl bedingt auszuführen?

Ich wollte eine araraRegel schreiben, die einen Befehl bedingt ausführt, wenn externe Dateien vorhanden sind.

Hier ist eine Beispielregel, die ich zum Laufen bringen konnte:

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

Ich kann auch bedingt auf eine Datei testen

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

Ich möchte ändern, was ich ausführe: nämlich den Teil "/bin/echo". Aber wenn ich so etwas versuche wie:

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

Dies läuft ohne Fehler, macht aber nicht das, was ich möchte.

Ich habe auch so etwas versucht:

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

Dies erzeugt einen Fehler

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

Meine Testdatei (mit dem Namen „example_01.tex“) sieht folgendermaßen aus:

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

Von der Befehlszeile aus gebe ich

$ arara -v example_01.tex

Das Ergebnis der Protokollierung ist:

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.

obwohl ich nicht wirklich sicher bin, wie ich das interpretieren soll.

Im Grunde möchte ich wissen, wie man eine Regel schreibt, die je nach Existenz einer anderen Datei anders ausgeführt wird.

Ich kann übrigens schreiben:

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

Ich wollte aber unbedingt, dass die Befehle über die Argumente ausgewählt werden.

Antwort1

Offenbar funktioniert Gruppenzwang. :)Ich schaue dich an, Tom.:P

Plan B, mal sehen ob ich 800 Stimmen bekomme: Ich bin Sicherheitsingenieur bei Facebook und das ist meine Schuld. :)

Ich sollte mich wahrscheinlich darauf konzentrieren, wie ich den Code optimieren kann, aber da ich in Eile bin, fällt mir momentan kein direkter Ansatz ein.:)

Der aufgetretene Fehler ist, unter der Oberfläche betrachtet, einer der Vorbehalte bei der Verwendung <arara>am Anfang eines Befehls: Wir können einige Anführungszeichen einsparen, aber es können einige Probleme aufgrund der YAML-Zuordnung auftreten.

Das :Zeichen wird im YAML-Format häufig verwendet. Daher verwirrt sein späteres Auftreten in der Zeichenfolge den Parser, was zu dem Fehler führt. Die Lösung besteht darin, sich auf die guten alten Anführungszeichen (einfach oder doppelt) zu verlassen. Da Sie bereits doppelte Anführungszeichen haben, verwenden Sie einfache:

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

Jetzt sollte es funktionieren. Naja, irgendwie.:)

flagwird nur ausgewertet, wenn das Argument in der Direktive vorhanden ist, andernfalls wird das Argument in einen leeren String aufgelöst. Damit diese Auswertung erfolgen kann, müssen Siehabenin der Direktive enthalten sein mycommand. Wenn Sie es nicht angeben, @{mycommand}bleibt die Hauptzeile command, in der es aufgerufen wird, leer.

Wenn Sie mycommandunabhängig von seinem Vorkommen in einer Direktive ausgewertet werden möchten, verwenden Sie for defaultanstelle von flag. Sehen wir uns ein Beispiel an:

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

Nehmen wir an, ich möchte eine Regel haben, in der ich definieren kann, welche Engine ich verwenden möchte. Dann habe ich ein engineArgument. Der erste Fall:

% arara: foo

ararawerde dies tun:

  1. Es liegt ein defaultEreignis vor, also beschließen Sie, enginees zu analysieren.
  2. Kein engineVorkommen in der Richtlinie, alles so belassen, wie es ist.

Am Ende des Tages enginewird sein pdflatex. Sehen wir uns nun den zweiten Fall an:

% arara: foo: { engine: xelatex }

araraverhält sich jetzt so:

  1. Es liegt ein defaultVorkommnis vor, also ermitteln Sie seine Auswertung . engineSie lautet:pdflatex
  2. engineIn der Direktive kommt Folgendes vor : Bewerten flagund ersetzen Sie den Standardwert.

Jetzt enginewird es sein xelatex.:)

Mit einigen geringfügigen Änderungen,

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

Ihre Regel funktioniert jetzt.:)

Ich hoffe es hilft!:)

verwandte Informationen