Ich habe eine Rake-Aufgabe, die einen Wert in mehrere Datenbanken einfügen muss.
Ich möchte diesen Wert an die Rake-Aufgabe von der Kommandozeile aus übergeben, oder von eine andere Rake-Aufgabe.
Wie kann ich das tun?
Ich habe eine Rake-Aufgabe, die einen Wert in mehrere Datenbanken einfügen muss.
Ich möchte diesen Wert an die Rake-Aufgabe von der Kommandozeile aus übergeben, oder von eine andere Rake-Aufgabe.
Wie kann ich das tun?
namespace :namespace1 do
task :task1, [:arg1, :arg2, :arg3] => :environment do |_t, args|
p args[:arg1]
end
end
aufrufen
rake namespace1:task1["1","2","3"]
Keine Angabe der Umgebung beim Aufruf erforderlich
in zsh müssen Aufrufe in Anführungszeichen eingeschlossen werden
'rake namespace1:task1["1","2","3"]'
Merci
Ich verwende ein normales Ruby-Argument in der Rake-Datei:
DB = ARGV[1]
dann lösche ich die Rake-Aufgaben am Ende der Datei aus (da Rake nach einer Aufgabe sucht, die auf diesem Argumentnamen basiert).
task :database_name1
task :database_name2
Befehlszeile:
rake mytask db_name
Dies erscheint mir sauberer als die Lösungen var=foo ENV var und die Aufgabe args[blah, blah2].
Der Stub ist ein wenig unübersichtlich, aber nicht allzu schlimm, wenn man nur ein paar Umgebungen hat, die einmalig eingerichtet werden müssen.
Um Rake-Aufgaben mit traditionellen Argumenten auszuführen:
rake task arg1 arg2
Und dann verwenden:
task :task do |_, args|
puts "This is argument 1: #{args.first}"
end
Fügen Sie folgenden Patch von rake gem:
Rake::Application.class_eval do
alias origin_top_level top_level
def top_level
@top_level_tasks = [top_level_tasks.join(' ')]
origin_top_level
end
def parse_task_string(string) # :nodoc:
parts = string.split ' '
return parts.shift, parts
end
end
Rake::Task.class_eval do
def invoke(*args)
invoke_with_call_chain(args, Rake::InvocationChain::EMPTY)
end
end
Die Wege zur Übergabe des Arguments sind in der obigen Antwort korrekt. Um eine Rake-Aufgabe mit Argumenten auszuführen, gibt es jedoch eine kleine technische Besonderheit in neueren Versionen von Rails
Es wird mit rake "namespace:taskname['argument1']" funktionieren.
Beachten Sie die invertierten Anführungszeichen bei der Ausführung der Aufgabe über die Befehlszeile.
Eine Sache, die ich hier nicht sehe, ist wie man willkürliche Argumente behandelt . Wenn Sie Argumente übergeben, die nicht in der Aufgabendefinition aufgeführt sind, sind sie dennoch unter args.extras
:
task :thing, [:foo] do |task, args|
puts args[:foo] # named argument
puts args.extras # any additional arguments that were passed
end
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.