铁轨项目中的耙子范围?

Mik*_*e A 7 rake ruby-on-rails

在我正在研究的项目中,我有很多使用rakes运行的解析器.当使用已存在于另一个rake中的方法名称,并且因为它们都使用相同的环境时,我会遇到冲突.

有没有办法限制其命名空间中的rake文件的范围?我认为那是命名空间的全部意义吗?

例:

namespace :test do
  task :test_task => :environment do
      ...
  end

  def test_method(argument)
    ...
  end    
end

namespace :other_test do
  task :test_task => :environment do
    ...
  end

  def test_method(argument, argument2)
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运行时rake test:test_task我会收到无效数量的参数错误.另一方面,如果我在任务本身内定义方法,我必须按顺序将方法保留在rake文件的顶部.这有点令人困惑和丑陋.

那只是一个必要的邪恶吗?

谢谢!

mu *_*ort 8

我认为rake任务的命名空间与文件系统中的目录服务的目的相同:它们是关于组织而不是封装.这就是为什么数据库任务在db:,Rails任务rails:,等等.

Rake命名空间不是类,因此test_method当您在Rake命名空间中定义时,您需要问自己要添加的类.答案是对象.因此,当您执行第二个任务时,Object已经有一个test_method方法,它接受一个参数,Ruby正确地抱怨.

最好的解决方案是让你的Rake任务非常薄(就像控制器一样),并将某些支持方法(例如test_method)关闭到某些库文件中.Rake任务通常应该只进行一些设置,然后调用库方法来完成实际工作(即与控制器相同的总体布局).

执行摘要:将所有实际工作和繁重工作放在库文件中的某个位置,并使您的Rake任务成为库的薄包装器.这应该通过适当的代码组织使您的问题消失.