Biorąc pod uwagę coś takiego:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
task :all => [:foo, :bar]
end
Jak :all
ustawić zadanie jako domyślne, aby uruchomienie rake my_tasks
go wywołało (zamiast dzwonić rake my_tasks:all
)?
Odpowiedzi:
Umieść go poza przestrzenią nazw w następujący sposób:
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"]
Ponadto ... jeśli twoje zadania wymagają argumentów, to:
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
Zwróć uwagę, jak w drugim przykładzie możesz nazwać zadanie taką samą nazwą jak przestrzeń nazw, tj. „Moje_zadania”
źródło
rake all
. W tym przypadku mam inne przestrzenie nazw, więc chcę móc nazwać zadaniemy_tasks:all
jakorake my_tasks
, a nie jakorake all
.Niezbyt intuicyjne, ale możesz mieć przestrzeń nazw i zadanie, które mają tę samą nazwę, a to skutecznie daje Ci to, czego chcesz. Na przykład
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
Teraz możesz uruchamiać polecenia takie jak:
rake my_task:foo
i
źródło
task :my_task => ['my_task:foo', 'my_task:bar']
Sugeruję użycie tego, jeśli masz dużo zadań w przestrzeni nazw.
task :my_tasks do Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}} end
Następnie możesz uruchomić wszystkie zadania w przestrzeni nazw przez:
Dzięki temu nie musisz się martwić o zmianę zadania: all podczas dodawania nowych zadań do tej przestrzeni nazw.
źródło
Używam tego Rakefile dla ogórka:
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"
Następnie, jeśli napiszę tylko:
Uruchamia domyślne zadanie, które uruchamia zarówno szybkie, jak i wolne testy.
Nauczyłem się tego z bloga Cheezy .
źródło
Sposób, w jaki czytam pytanie obvio171, polega na tym, że prosi on 1) o systematyczny sposób wywoływania określonego zadania w przestrzeni nazw, wywołując przestrzeń nazw jako zadanie.
Często spotykałem się z tą samą potrzebą. Lubię logicznie grupować zadania w przestrzenie nazw. Często to grupowanie przypomina hierarchię. Stąd chęć przywołania grupy ma dla mnie bardzo sens.
Oto moja opinia:
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) ... lub pytał lata temu. Niemniej jednak wciąż interesujące pytanie.
źródło
Dodaj następujące zadanie poza przestrzenią nazw:
desc "Run all my tasks" task :my_tasks => ["my_tasks:all"]
Pamiętaj, że możesz mieć zadanie o tej samej nazwie, co przestrzeń nazw.
I jeszcze większy przykład, który pokazuje, jak można wykorzystać zadania, które mają taką samą nazwę jak przestrzeń nazw, nawet podczas zagnieżdżania przestrzeni nazw:
namespace :job1 do task :do_something1 do puts "job1:do_something1" end task :do_something2 do puts "job1:do_something2" end task :all => [:do_something1, :do_something2] end desc "Job 1" task :job1 => ["job1:all"] # You do not need the "all"-task, but it might be handier to have one. namespace :job2 do task :do_something1 do puts "job2:do_something1" end task :do_something2 do puts "job2:do_something2" end end desc "Job 2" task :job2 => ["job2:do_something1", "job2:do_something2"] namespace :superjob do namespace :job1 do task :do_something1 do puts "superjob:job1:do_something1" end task :do_something2 do puts "superjob:job1:do_something2" end end desc "Job 1 in Superjob" task :job1 => ["job1:do_something1", "job1:do_something2"] namespace :job2 do task :do_something1 do puts "superjob:job2:do_something1" end task :do_something2 do puts "superjob:job2:do_something2" end end desc "Job 2 in Superjob" task :job2 => ["job2:do_something1", "job2:do_something2"] end desc "My Super Job" task :superjob => ["superjob:job1", "superjob:job2"] # Do them all just by calling "$ rake" task :default => [:job1, :job2, :superjob]
Po prostu skopiuj i wypróbuj.
źródło
Oparte na rozwiązaniu Rocky'ego Domyślne zadanie dla przestrzeni nazw w Rake
I odpowiedź tego Dextera Czy istnieje sposób, aby poznać aktualne zadanie rake?
namespace :root do namespace :foo do end namespace :target do task :all do |task_all| Rake.application.in_namespace(task_all.scope.path) do |ns| ns.tasks.each { |task| task.invoke unless task.name == task_all.name } end end task :one do end task :another do end end end
źródło
Łącząc odpowiedzi Szymona Lipińskiego i Shyama Habarakady, oto odpowiedź, która moim zdaniem jest najbardziej idiomatyczna i rozsądna:
namespace :my_tasks do task :foo do do_something end task :bar do do_something_else end end task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]
pozwala to zrobić
rake my_tasks
, unikając kłopotliwego wywoływania podzadań.źródło