Domyślne zadanie dla przestrzeni nazw w Rake

88

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 :allustawić zadanie jako domyślne, aby uruchomienie rake my_tasksgo wywołało (zamiast dzwonić rake my_tasks:all)?

Helder S Ribeiro
źródło
czy próbowałeś umieścić wartość domyślną w przestrzeni nazw (task: default =>: all)
Jim Deville
Zrób to, co opisuje Jim, tylko zadanie domyślne wychodzi poza przestrzeń nazw i musi zawierać przestrzeń nazw i nazwę zadania. (task: default => "my_tasks: all") Zobacz moją odpowiedź poniżej, aby zobaczyć działający przykład.
Randy Eppinger

Odpowiedzi:

87

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”

Szymon Lipiński
źródło
4
To tylko sprawia, że ​​można go nazwać jako rake all. W tym przypadku mam inne przestrzenie nazw, więc chcę móc nazwać zadanie my_tasks:alljako rake my_tasks, a nie jako rake all.
Helder S Ribeiro
53
więc po prostu użyj: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Szymon Lipiński
2
Głosowałem za komentarzem Simona, zapomniałem, że tak to robię.
Jim Deville,
52

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

rake my_task
Shyam Habarakada
źródło
3
to jest świetne i spełnia wszystkie wymagania podane w pytaniu.
Ivar,
1
Myślę, że wywołanie jest zbyt skomplikowane i powinno to być po prostu zależności od zadań:task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber,
8

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:

rake my_tasks

Dzięki temu nie musisz się martwić o zmianę zadania: all podczas dodawania nowych zadań do tej przestrzeni nazw.

Skalisty
źródło
3

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:

rake

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

Nauczyłem się tego z bloga Cheezy .

Randy Eppinger
źródło
3

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.

zor-el
źródło
1

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.

tvw
źródło
0

Łą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ń.

Alexander Presber
źródło