Rake中名称空间的默认任务


87

给出类似的东西:

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


您是否尝试过将默认值放入命名空间(任务:default =>:all)
Jim Deville,

按照Jim的描述,只有默认任务位于名称空间之外,并且必须包含名称空间和任务名称。(task:default =>“ my_tasks:all”)请参阅下面的答案以获取工作示例。
兰迪·埃平格

Answers:


86

像这样将其放置在命名空间之外:

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”


4
这样只能将其称为rake all。在这种情况下,我还有其他名称空间,所以我想要的是能够将任务调用my_tasks:allrake my_tasks,而不是rake all
Helder S Ribeiro

53
所以只需使用:task:my_tasks => [“ my_tasks:foo”,“ my_tasks:bar”]
SzymonLipiński09年

2
经过simon的评论投票,我忘记了这是我的方式。
Jim Deville

51

不是很直观,但是您可以拥有一个具有相同名称的名称空间和任务,并且可以有效地为您提供所需的内容。例如

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

3
这很棒,并涵盖了问题中所述的所有要求。
Ivar 2014年

1
我认为调用过于复杂,应该仅依赖于任务:task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber

8

如果命名空间中有很多任务,建议您使用此功能。

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

然后,您可以通过以下方式运行名称空间中的所有任务:

rake my_tasks

这样,当您向该命名空间添加新任务时,您无需担心更改:all任务。


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

它运行默认任务,该任务同时运行快速和慢速测试。

我了解到这个来自Cheezy的博客


3

我正在阅读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) ...还是几年前问的。尽管如此,仍然是一个有趣的问题。


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]

只需复制并尝试一下即可。



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可以避免繁琐地调用子任务。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.