
Ich wollte eine arara
Regel 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.:)
flag
wird 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 mycommand
unabhängig von seinem Vorkommen in einer Direktive ausgewertet werden möchten, verwenden Sie for default
anstelle 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 engine
Argument. Der erste Fall:
% arara: foo
arara
werde dies tun:
- Es liegt ein
default
Ereignis vor, also beschließen Sie,engine
es zu analysieren. - Kein
engine
Vorkommen in der Richtlinie, alles so belassen, wie es ist.
Am Ende des Tages engine
wird sein pdflatex
. Sehen wir uns nun den zweiten Fall an:
% arara: foo: { engine: xelatex }
arara
verhält sich jetzt so:
- Es liegt ein
default
Vorkommnis vor, also ermitteln Sie seine Auswertung .engine
Sie lautet:pdflatex
engine
In der Direktive kommt Folgendes vor : Bewertenflag
und ersetzen Sie den Standardwert.
Jetzt engine
wird 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!:)