给出类似的东西:
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
task :all => [:foo, :bar]
end
如何使它:all
成为默认任务,以便运行时rake my_tasks
可以调用它(而不是必须调用rake my_tasks:all
)?
Answers:
像这样将其放置在命名空间之外:
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
和
rake my_task
task :my_task => ['my_task:foo', 'my_task:bar']
我将这个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
它运行默认任务,该任务同时运行快速和慢速测试。
我正在阅读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]
只需复制并尝试一下即可。
而这个dexter的答案有没有办法知道当前的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