Учитывая что-то вроде:
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
)?
Ответы:
Поместите его вне пространства имен следующим образом:
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».
источник
rake all
. В этом случае у меня есть другие пространства имен, поэтому я хочу иметь возможность называть задачуmy_tasks:all
какrake my_tasks
, а не какrake all
.Не очень интуитивно понятно, но у вас может быть пространство имен и задача с одинаковыми именами, и это дает вам то, что вы хотите. Например
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
а также
источник
task :my_task => ['my_task:foo', 'my_task:bar']
Я предлагаю вам использовать это, если у вас много задач в пространстве имен.
task :my_tasks do Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}} end
А затем вы можете запускать все задачи в пространстве имен:
При этом вам не нужно беспокоиться об изменении вашей задачи: all при добавлении новых задач в это пространство имен.
источник
Я использую этот 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"
Затем, если я наберу просто:
Он запускает задачу по умолчанию, которая запускает как быстрые, так и медленные тесты.
Я узнал об этом из блога Cheezy .
источник
Я читаю вопрос 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) ... или спрашивал много лет назад. Тем не менее, все еще интересный вопрос.
источник
Добавьте следующую задачу вне пространства имен:
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]
Просто скопируйте его и попробуйте.
источник
На основе решения Rocky Задача по умолчанию для пространства имен в 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
источник
Объединив ответы Шимона Липинского и Шьяма Хабаракады, вот что я считаю наиболее идиоматическим и логичным:
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
, избегая громоздких вызовов подзадач.источник