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 )?

把它放在这样的命名空间之外:

 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”

不是很直观,但是你可以有一个命名空间和一个具有相同名称的任务,并有效地给你你想要的。 例如

 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 

如果在命名空间中有很多任务,我build议你使用这个。

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

然后你可以通过下面的命令运行命名空间中的所有任务:

 rake my_tasks 

有了这个,当您将新任务添加到该名称空间时,您不必担心要更改:全部任务。

我使用这个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" 

那么如果我input:

 rake 

它运行默认任务,同时运行快速和慢速testing。

我从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的解决schemeRake中名称空间的默认任务

这个德克斯特的答案有没有办法知道当前的耙任务?

 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