给出类似的东西:
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
)?
答案 0 :(得分:85)
将它放在名称空间之外,如下所示:
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”
答案 1 :(得分:49)
不是很直观,但您可以拥有一个名称空间和名称相同的任务,并且可以有效地为您提供所需的内容。例如
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
答案 2 :(得分:8)
如果命名空间中有很多任务,我建议你使用它。
task :my_tasks do
Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end
然后您可以通过以下方式运行命名空间中的所有任务:
rake my_tasks
有了这个,当您将新任务添加到该命名空间时,您无需担心更改:all任务。
答案 3 :(得分: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
它运行默认任务,运行快速和慢速测试。
我从this学到了Cheezy's blog。
答案 4 :(得分:2)
我在阅读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) ......或多年前就在问。尽管如此,这仍然是一个有趣的问题。
答案 5 :(得分: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]
只需复制即可试用。
答案 6 :(得分:0)
基于Rocky的解决方案Default task for namespace in Rake
这个德克斯特的回答Is there a way to know the current rake task?
if cur_word.isDisjointWith(item.characters) {
maximum = ...
}
答案 7 :(得分:0)
结合SzymonLipiński和Shyam Habarakada的答案,这是我认为最惯用和简洁的答案:
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
,同时避免繁琐的子任务调用。