Rake中命名空间的默认任务

Hel*_*iro 83 ruby rake

给出如下内容:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

  task :all => [:foo, :bar]
end
Run Code Online (Sandbox Code Playgroud)

我如何:all成为默认任务,以便运行rake my_tasks会调用它(而不是必须调用rake my_tasks:all)?

Szy*_*ski 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"]
Run Code Online (Sandbox Code Playgroud)

另外......如果您的任务需要参数,那么:

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
Run Code Online (Sandbox Code Playgroud)

请注意,在第二个示例中,您可以将任务调用与命名空间相同的名称,即'my_tasks'

  • 所以然后使用:task:my_tasks => ["my_tasks:foo","my_tasks:bar"] (51认同)
  • 这只能让它被称为"rake all".在这种情况下,我有其他名称空间,所以我想要的是能够将任务`my_tasks:all`称为`rake my_tasks`,而不是`rake all`. (4认同)
  • 投票支持西蒙的评论,我忘了我是这样做的. (2认同)

Shy*_*ada 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
Run Code Online (Sandbox Code Playgroud)

现在您可以运行命令,

rake my_task:foo
Run Code Online (Sandbox Code Playgroud)

rake my_task
Run Code Online (Sandbox Code Playgroud)

  • 这很好,涵盖了问题中陈述的所有要求. (3认同)

Roc*_*cky 8

如果命名空间中有很多任务,我建议你使用它.

task :my_tasks do
  Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end
Run Code Online (Sandbox Code Playgroud)

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

rake my_tasks
Run Code Online (Sandbox Code Playgroud)

这样,在将新任务添加到该命名空间时,您无需担心更改:all任务.