91 Stimmen

Standardaufgabe für Namespace in Rake

In etwa so:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

  task :all => [:foo, :bar]
end

Wie kann ich die :all die Standardaufgabe sein, so dass die Ausführung von rake my_tasks aufruft (anstatt die rake my_tasks:all )?

89voto

Szymon Lipiński Punkte 24492

Platzieren Sie es außerhalb des Namensraums wie folgt:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

end

task :all => ["my_tasks:foo", "my_tasks:bar"]

Außerdem... wenn Ihre Aufgaben Argumente erfordern, dann:

namespace :my_tasks do
  task :foo, :arg1, :arg2 do |t, args|
    do_something
  end

  task :bar, :arg1, :arg2  do |t, args|
    do_something_else
  end

end

task :my_tasks, :arg1, :arg2 do |t, args|
  Rake::Task["my_tasks:foo"].invoke( args.arg1, args.arg2 )
  Rake::Task["my_tasks:bar"].invoke( args.arg1, args.arg2 )
end

Beachten Sie, dass Sie im 2. Beispiel die Aufgabe mit demselben Namen wie den Namensraum aufrufen können, d. h. "my_tasks".

52voto

Shyam Habarakada Punkte 14267

Nicht sehr intuitiv, aber Sie können einen Namensraum und eine Aufgabe mit demselben Namen haben, und das gibt Ihnen effektiv, was Sie wollen. Zum Beispiel

namespace :my_task do
  task :foo do
    do_foo
  end
  task :bar do
    do_bar
  end
end

task :my_task do
  Rake::Task['my_task:foo'].invoke
  Rake::Task['my_task:bar'].invoke
end

Jetzt können Sie Befehle ausführen wie,

rake my_task:foo

y

rake my_task

9voto

Rocky Punkte 5166

Ich schlage vor, dass Sie dies verwenden, wenn Sie viele Aufgaben im Namensraum haben.

task :my_tasks do
  Rake.application.in_namespace(:my_tasks){|namespace| namespace.tasks.each(&:invoke)}
end

Und dann können Sie alle Aufgaben in dem Namensraum ausführen, indem:

rake my_tasks

Auf diese Weise müssen Sie sich nicht darum kümmern, Ihre :all-Aufgabe zu ändern, wenn Sie neue Aufgaben in diesem Namensraum hinzufügen.

4voto

Randy Eppinger Punkte 974

Ich verwende diese Rakefile für Gurken:

require 'cucumber'
require 'cucumber/rake/task'

namespace :features do
  Cucumber::Rake::Task.new(:fast) do |t|
    t.profile = 'fast'
  end

  Cucumber::Rake::Task.new(:slow) do |t|
    t.profile = 'slow'
  end

  task :ci => [:fast, :slow]
end

task :default => "features:ci"

Wenn ich dann einfach tippe:

rake

Es wird die Standardaufgabe ausgeführt, die sowohl schnelle als auch langsame Tests durchführt.

Ich habe gelernt ce von Cheezy's Blog .

3voto

zor-el Punkte 180

Ich verstehe die Frage von obvio171 so, dass er fragt 1) für einen systematischen Weg, eine bestimmte Aufgabe in einem Namespace aufzurufen, indem der Namespace als Aufgabe aufgerufen wird.

Das gleiche Bedürfnis habe ich schon oft erlebt. Ich möchte Aufgaben logisch in Namensräumen gruppieren. Oft ähnelt diese Gruppierung einer Hierarchie. Daher macht der Wunsch, die Gruppe aufzurufen, für mich sehr viel Sinn.

Hier ist meine Meinung dazu:

module Rake::DSL
  def group(name, &block)
    ns = namespace name, &block
    default = ns[:default]
    task name => "#{name}:default" if default
    ns
  end
end

group :foo do
  task :foo1 do |t| puts t.name end
  task :foo2 do |t| puts t.name end
  task :default => [:foo1, :foo2]
end

task :default => :foo

1) ...oder vor Jahren gefragt hat. Trotzdem eine interessante Frage.

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