2009-10-16 13 views
80

Biorąc pod uwagę coś takiego:Domyślnie zadanie dla nazw prowizji

namespace :my_tasks do 
    task :foo do 
    do_something 
    end 

    task :bar do 
    do_something_else 
    end 

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

Jak zrobić :all być domyślne zadanie, dzięki czemu działa rake my_tasks będzie to nazwać (zamiast zadzwonić rake my_tasks:all)?

+0

próbowałeś wprowadzenie domyślnego w przestrzeni nazw (zadanie: default =>: all) –

+3

tak, że nie działa :/ – hsribei

+0

Zrób to, co Jim opisuje, tylko domyślne zadanie wykracza poza przestrzeń nazw i musi zawierać przestrzeń nazw i zadania. (task: default => "my_tasks: all") Poniżej znajduje się moja odpowiedź na przykład. –

Odpowiedz

83

Umieść go na zewnątrz przestrzeni nazw tak:

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"] 

... Także jeśli zadania wymagają argumentów następnie:

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 

zauważyć, jak w 2. Przykładowo można nazwać samo zadanie nazwa jako przestrzeń nazw, tj. "moje_tasky"

+2

To tylko sprawia, że ​​można go nazwać "rake all". W tym przypadku mam inne przestrzenie nazw, więc to, co chcę, to móc wywołać zadanie 'my_tasks: all' jako' rake my_tasks', a nie jako 'rake all'. – hsribei

+48

więc po prostu użyj: Zadanie: my_tasks => ["my_tasks: foo", "my_tasks: bar"] –

+1

Głosowałem za komentarzem Simona, zapomniałem, że tak to robię. –

45

Niezbyt intuicyjne, ale możesz mieć przestrzeń nazw i zadania o tej samej nazwie, co 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żna uruchomić poleceń takich jak,

rake my_task:foo 

i

rake my_task 
+3

to jest świetne i spełnia wszystkie wymagania określone w pytaniu. – Ivar

3

Używam tego Rakefile dla Ogórek:

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 wpisuję tylko :

rake 

Uruchamia zadanie domyślne, które wykonuje zarówno szybkie, jak i powolne testy.

Nauczyłem się this od Cheezy's blog.

8

Proponuję użyć tego, jeśli masz wiele zadań w przestrzeni nazw.

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

a następnie można uruchomić wszystkie zadania w obszarze nazw, których autorem jest:

rake my_tasks 

z tym, że nie trzeba się martwić, aby zmienić: wszystkie zadania podczas dodawania nowych zadań w tym obszarze nazw .

2

Sposób, w jaki czytam pytanie obvio171, polega na tym, że pyta on: 1) o systematyczny sposób wywoływania określonego zadania w przestrzeni nazw poprzez wywoływanie przestrzeni nazw jako zadania.

Często spotykałem tę samą potrzebę. Lubię logicznie grupować zadania w przestrzenie nazw. Często ta grupa przypomina hierarchię. Dlatego chęć powołania grupy ma dla mnie bardzo duży sens.

Oto moje ujęcie. Powiedz mi co myślisz.

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) ... albo pytał przed laty. Niemniej jednak nadal interesujące pytanie.

1

Dodaj następujące zadania poza obszarem nazw:

desc "Run all my tasks" 
task :my_tasks => ["my_tasks:all"] 

Należy pamiętać, że można mieć zadanie o takiej samej nazwie jak nazw.

I hier większy przykład, który pokazuje, w jaki sposób można skorzystać z zadań, które mają taką samą nazwę jak nazw, nawet gdy gniazdowania 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] 

Wystarczy skopiować go i go wypróbować.

Powiązane problemy