1216 Stimmen

Übergabe von Kommandozeilenargumenten an einen Rake-Task

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?

17voto

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

13voto

djburdick Punkte 11248

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.

6voto

Daniel Garmoshka Punkte 4813

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

5voto

Asim Mushtaq Punkte 445

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.

5voto

lobati Punkte 7583

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.com

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.

Powered by:

X