Ich habe eine Rechenaufgabe, die einen Wert in mehrere Datenbanken einfügen muss.
Ich möchte diesen Wert über die Befehlszeile oder über eine andere Rechenaufgabe an die Rechenaufgabe übergeben.
Wie kann ich das machen?
ruby
command-line
rake
command-line-arguments
Tilendor
quelle
quelle
Antworten:
Optionen und Abhängigkeiten müssen sich in Arrays befinden:
Dann
SCHIENEN HINWEIS:
quelle
rake thing:work[1, 2, 3]
da es nicht funktioniert und du einen FehlerDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
rake 'thing:work[1,2,3]'
:environment
Symbol aus Ihrer Aufgabe entfernen . Schienenanwendungen haben eine: Umweltaufgabe ...t
Mitteltask
, warum nicht nur verwenden ,task
als param name?Sie können formale Argumente in Rake angeben, indem Sie dem Taskaufruf Symbolargumente hinzufügen. Zum Beispiel:
Dann von der Kommandozeile:
Wie im zweiten Beispiel gezeigt, sind die Anführungszeichen um den Zielnamen erforderlich, wenn Sie Leerzeichen verwenden möchten, damit die Shell die Argumente im Leerzeichen nicht aufteilt.
Wenn Sie sich den Code in rake.rb ansehen , scheint es, dass Rake keine Task-Strings analysiert, um Argumente für die Voraussetzungen zu extrahieren. Dies ist also nicht möglich
task :t1 => "dep[1,2]"
. Die einzige Möglichkeit, unterschiedliche Argumente für eine Voraussetzung anzugeben, besteht darin, sie explizit innerhalb der abhängigen Taskaktion wie in:invoke_my_task
und aufzurufen:invoke_my_task_2
.Beachten Sie, dass Sie bei einigen Shells (wie zsh) die Klammern verlassen müssen:
rake my_task\['arg1'\]
quelle
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), sodass Sie die Klammern umgehen müssen :rake my_task\['arg1'\]
. Von robots.thoughtbot.com/post/18129303042/…Zusätzlich zur Antwort von kch (ich habe nicht gefunden, wie ich einen Kommentar dazu hinterlassen kann, sorry):
Sie müssen
ENV
vor demrake
Befehl keine Variablen als Variablen angeben . Sie können sie einfach wie gewohnt wie folgt festlegen:und greifen Sie auf diese aus Ihrer Rake-Datei als ENV-Variablen wie diese zu:
quelle
p
?Wenn Sie benannte Argumente übergeben möchten (z. B. mit Standard
OptionParser
), können Sie Folgendes verwenden:Beachten Sie
--
, dass dies erforderlich ist, um Standard-Rake-Argumente zu umgehen. Sollte die Arbeit mit Rechen 0.9.x , <= 10.3.x .Newer Rake hat das Parsen von geändert
--
, und jetzt müssen Sie sicherstellen, dass es nicht an dieOptionParser#parse
Methode übergeben wird, z. B. mitparser.parse!(ARGV[2..-1])
exit
Am Ende wird sichergestellt, dass die zusätzlichen Argumente nicht als Rechenaufgabe interpretiert werden.Auch die Verknüpfung für Argumente sollte funktionieren:
Wenn Rake-Skripte so aussehen, ist es vielleicht an der Zeit, nach einem anderen Tool zu suchen, mit dem dies sofort möglich ist.
quelle
--option-names
. Mein einziger Vorschlag wäre, zu verwenden ,exit
anstattabort
wieabort
werden Sie mit einem Return - Code von 1 an dem Shell verlassen. Wenn die Rake-Task Teil eines übergeordneten Skripts ist, wird häufiger angenommen, dass ein Exit ungleich Null eine Art Fehler ist.--
? Wierake
Argumente an die eigentliche Aufgabe weitergeben oder so? Wietask :my_task, :*args do |t, args|
oder so?{username}
hier ist. Wo wird es verwendet? Warum ist es nicht da drin-u {username}
? Prost10.4.1
und Weise, wie Rake ARGV analysiert, wurde geändert und zurückgesetzt10.4.2
. github.com/ruby/rake/commit/…Ich habe die Antwort von diesen beiden Websites gefunden: Net Maniac und Aimred .
Sie benötigen eine Version> 0,8 von Rake, um diese Technik verwenden zu können
Die normale Beschreibung der Rechenaufgabe lautet wie folgt:
Führen Sie drei Schritte aus, um Argumente zu übergeben:
Verwenden Sie args.arg_name, um auf die Argumente im Skript zuzugreifen
Um diese Aufgabe über die Befehlszeile aufzurufen, übergeben Sie ihr die Argumente in [] s
wird ausgegeben
Wenn Sie diese Aufgabe von einer anderen Aufgabe aus aufrufen und ihr Argumente übergeben möchten, verwenden Sie invoke
dann der Befehl
wird ausgegeben
Ich habe keine Möglichkeit gefunden, Argumente als Teil einer Abhängigkeit zu übergeben, da der folgende Code unterbrochen wird:
quelle
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Eine weitere häufig verwendete Option ist die Übergabe von Umgebungsvariablen. In Ihrem Code lesen Sie sie über
ENV['VAR']
und können sie direkt vor demrake
Befehl übergeben, wiequelle
rake blah -- --these --go --to --a-program
(Beachten Sie die--
, um Rake mitzuteilen, dass seine Schalter beendet sind), siehe stackoverflow.com/questions/5086224/…Eigentlich hat @Nick Desjardins perfekt geantwortet. Aber nur für die Bildung: Sie können einen schmutzigen Ansatz verwenden:
ENV
Argumente verwendenquelle
Ich konnte nicht herausfinden, wie man Argumente und auch die: Umgebung weitergibt, bis ich das herausgefunden habe:
Und dann rufe ich so an:
quelle
quelle
rake task_name[hello, world]
Ich wollte nur laufen können:
Einfach, oder? (Nee!)
Rake interpretiert
arg1
undarg2
als Aufgaben und versucht, sie auszuführen. Also brechen wir einfach ab, bevor es passiert.Nimm das, Klammern!
Haftungsausschluss : Ich wollte dies in einem ziemlich kleinen Haustierprojekt tun können. Nicht für die Verwendung in der "realen Welt" vorgesehen, da Sie nicht mehr in der Lage sind, Rechenaufgaben (dh
rake task1 task2 task3
) zu verketten . IMO nicht wert. Benutze einfach das Hässlicherake task[arg1,arg2]
.quelle
_, arg1, arg2 = ARGV
da das erste Argument der Name der Rechenaufgabe war. Aber dasexit
ist ein ordentlicher Trick.rake task[arg1,arg2] && rake task2 && rake task3
Ich bin mir nicht sicher, ob das weniger hässlich ist alsrake task[arg1,arg2] task2 task3
. Wahrscheinlich weniger effizient._, *args = ARGV
ist perfekt, um alle nachfolgenden Argumente zu erfassen! Tausend Dank!Ich verwende ein reguläres Ruby-Argument in der Rake-Datei:
Dann lösche ich die Rake-Tasks am Ende der Datei (da Rake nach einer Task sucht, die auf diesem Argumentnamen basiert).
Befehlszeile:
das fühlt sich für mich sauberer an als die var = foo ENV var und die task args [blah, blah2] lösungen.
Der Stub ist ein wenig ruckelig, aber nicht schlecht, wenn Sie nur ein paar Umgebungen haben, die einmalig eingerichtet sind
quelle
dup
am Ende: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
, um eine Ausnahme vom Duping einer Null zu verhindern.Die Möglichkeiten, Argumente zu übergeben, sind in der obigen Antwort korrekt. Um jedoch eine Rechenaufgabe mit Argumenten auszuführen, ist eine neuere technische Version von Schienen mit einer kleinen Technik verbunden
Es funktioniert mit Rake "Namespace: Taskname ['Argument1']"
Beachten Sie die invertierten Anführungszeichen beim Ausführen der Aufgabe über die Befehlszeile.
quelle
Um Argumente an die Standardaufgabe zu übergeben, können Sie Folgendes tun. Sagen Sie zum Beispiel "Version" ist Ihr Argument:
Dann können Sie es so nennen:
oder
oder
Ich habe jedoch keine Möglichkeit gefunden, die Angabe des Aufgabennamens (Standard oder Build) bei der Übergabe von Argumenten zu vermeiden. Würde gerne hören, wenn jemand einen Weg kennt.
quelle
Ich mag die "Querystring" -Syntax für die Übergabe von Argumenten, insbesondere wenn viele Argumente übergeben werden müssen.
Beispiel:
Der "Querystring" ist:
Warnung: Beachten Sie, dass die Syntax
rake "mytask[foo=bar]"
und NICHT istrake mytask["foo=bar"]
Wenn
Rack::Utils.parse_nested_query
wir innerhalb der Rechenaufgabe mit analysieren , erhalten wir einHash
:(Das Coole ist, dass Sie Hashes und Arrays übergeben können, mehr unten)
So erreichen Sie das:
Hier ist ein erweitertes Beispiel, das ich mit Rails in meinem Juwel " delay_job_active_record_threaded" verwende :
Auf die gleiche Weise wie oben analysiert, mit einer Umgebungsabhängigkeit (um die Rails-Umgebung zu laden)
Gibt Folgendes an
options
quelle
Wenn Sie sich nicht die Mühe machen können, sich daran zu erinnern, welche Argumentposition für was ist, und Sie möchten so etwas wie einen Ruby-Argument-Hash tun. Sie können ein Argument verwenden, um eine Zeichenfolge zu übergeben und diese Zeichenfolge dann in einen Options-Hash umzuwandeln.
Und auf der Kommandozeile erhalten Sie.
quelle
Die meisten der oben beschriebenen Methoden haben bei mir nicht funktioniert, möglicherweise sind sie in den neueren Versionen veraltet. Die aktuelle Anleitung finden Sie hier: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
Eine Kopie zum Kopieren und Einfügen aus dem Handbuch finden Sie hier:
Rufen Sie es so auf
quelle
So führen Sie Rechenaufgaben mit traditionellem Argumentationsstil aus:
Und dann benutze:
Fügen Sie folgenden Patch Rake Gem hinzu:
quelle
Während Sie Parameter übergeben, ist es besser, eine Eingabedatei zu verwenden. Dies kann ein Excel-JSON oder was auch immer Sie benötigen, und von dort aus lesen Sie die Datenstruktur und Variablen, die Sie benötigen, einschließlich des Variablennamens, wie es erforderlich ist. Das Lesen einer Datei kann die folgende Struktur haben.
Beispiel json
Ausführung
quelle