Задача по умолчанию для пространства имен в Rake
Учитывая что-то вроде:
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
)?
Ответы
Ответ 1
Поместите его за пределы пространства имен следующим образом:
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"
Ответ 2
Не очень интуитивно, но вы можете иметь пространство имен и задачу с тем же именем, и это эффективно дает вам то, что вы хотите. Например,
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
Я предлагаю вам использовать это, если у вас много задач в пространстве имен.
task :my_tasks do
Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end
И затем вы можете запускать все задачи в пространстве имен:
rake my_tasks
При этом вам не нужно беспокоиться, чтобы изменить свою: все задачи при добавлении новых задач в это пространство имен.
Ответ 4
Я использую этот 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
Он запускает задачу по умолчанию, которая запускает как быстрые, так и медленные тесты.
Я узнал this из Cheezy blog.
Ответ 5
То, как я читаю 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)... или спрашивал, много лет назад. Тем не менее еще интересный вопрос.
Ответ 6
Добавьте следующую задачу за пределы пространства имен:
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]
Просто скопируйте его и попробуйте.
Ответ 7
На основе решения Rocky Задача по умолчанию для пространства имен в Rake
И этот ответ dexter Есть ли способ узнать текущую задачу рейка?
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