Rake中命名空间的默认任务

时间:2009-10-16 17:01:59

标签: ruby 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)?

8 个答案:

答案 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,同时避免繁琐的子任务调用。