Завдання за замовчуванням для простору імен у Rake


87

Дано щось на зразок:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

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

Як зробити :allтак, щоб завдання було за замовчуванням, щоб запуск rake my_tasksвикликав його (замість того, щоб телефонувати rake my_tasks:all)?


ви пробували помістити за замовчуванням у простір імен (завдання: за замовчуванням =>: все)
Джим Девіл,

Робіть те, що описує Джим, лише завдання за замовчуванням виходить за межі простору імен і повинно включати простір імен та ім’я завдання. (завдання: за замовчуванням => "my_tasks: all") Див. мою відповідь нижче для робочого прикладу.
Ренді Еппінгер,

Відповіді:


86

Розмістіть його поза простором імен таким чином:

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

Також ... якщо ваші завдання вимагають аргументів, тоді:

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

Зверніть увагу, як у другому прикладі ви можете назвати завдання тим самим іменем, що і простір імен, тобто 'my_tasks'


4
Це лише робить його доступним для виклику як rake all. У цьому випадку у мене є інші простори імен, тому я хочу мати можливість викликати завдання my_tasks:allяк rake my_tasks, а не як rake all.
Helder S Ribeiro

53
то тоді просто використовуйте: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Шимон Ліпінський

2
Голосуючи за коментар Сімона, я забув, що так я це роблю.
Джим Девіл,

51

Не дуже інтуїтивно зрозуміло, але у вас може бути простір імен і завдання, що мають однакові назви, і це ефективно дає вам те, що ви хочете. Наприклад

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

Тепер ви можете запускати такі команди, як:

rake my_task:foo

і

rake my_task

3
це чудово і охоплює всі вимоги, викладені у питанні.
Івар

1
Я думаю, що виклик надто складний, і це повинні бути лише залежності від завдань:task :my_task => ['my_task:foo', 'my_task:bar']
Олександр Пресбер

8

Я пропоную вам використовувати це, якщо у вас є багато завдань у просторі імен.

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

І тоді ви можете запустити всі завдання в просторі імен, виконавши:

rake my_tasks

З цим вам не потрібно турбуватися, щоб змінити своє: все завдання, коли ви додаєте нові завдання до цього простору імен.


3

Я використовую цей Rakefile для огірка:

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"

Тоді, якщо я наберу просто:

rake

Він запускає завдання за замовчуванням, яке виконує як швидкі, так і повільні тести.

Я дізнався про це з блогу Чізі .


3

Я читаю запитання obvio171 у тому, що він просить 1) систематичний спосіб викликати певне завдання у просторі імен, викликаючи простір імен як завдання.

Я часто стикався з такою ж потребою. Мені подобається логічно групувати завдання в простори імен. Часто таке групування нагадує ієрархію. Звідси бажання викликати групу для мене має дуже великий сенс.

Ось моя думка:

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) ... або просив, багато років тому. Тим не менше, все ще цікаве питання.


1

Додайте таке завдання поза простором імен:

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

Майте на увазі, що ви можете мати завдання з такою ж назвою, що і простір імен.

І отримайте більший приклад, який показує, як ви можете використовувати завдання, які мають те саме ім’я, що і простір імен, навіть коли вкладаєте простори імен:

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]

Просто скопіюйте його і спробуйте.


0

На основі рішення Рокі завдання за замовчуванням для простору імен у 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

0

Поєднуючи відповіді Шимона Ліпінського та Шям Хабаракади, ось, на мою думку, є найбільш ідіоматичною та послідовною відповіддю:

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

дозволяє робити rake my_tasks, уникаючи громіздкого виклику підзадач.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.