Rails项目中的耙子范围?

问题描述

| 在我正在处理的项目中,有很多使用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
在这种情况下,运行ѭ1时,我将收到无效数量的参数错误。另一方面,如果我在任务本身中定义方法,则必须按顺序将方法保持在rake文件的顶部。这变得有些混乱和丑陋。 这仅仅是必要的邪恶吗? 谢谢!     

解决方法

        我看到rake任务的名称空间与文件系统中的目录具有相同的作用:它们与组织而不是封装有关。这就是为什么数据库任务位于
db:
中,Rails任务位于
rails:
中,等等。 Rake命名空间不是类,因此当您在Rake命名空间中定义4时,您需要问自己要添加哪个类。答案是对象。因此,当您执行第二项任务时,Object已经有一个采用一个参数的
test_method
方法,而Ruby正确地抱怨了。 最好的解决方案是使您的Rake任务非常薄(就像控制器一样),并将任何支持方法(例如
test_method
)放在合理的某个库文件中。 Rake任务通常应该进行一些设置,然后调用库方法来完成实际工作(即与控制器相同的常规布局)。 执行摘要:将所有实际工作和繁重的工作放在库文件中的某个位置,并使Rake任务成为库的薄包装器。这应该使您的问题通过适当的代码组织解决。     ,        
module Anonymous
  namespace :test do
    # brabra
  end
end
self.class.send(:remove_const,:Anonymous)

module Anonymous
  namespace :another_test do
    # brabra
  end
end
self.class.send(:remove_const,:Anonymous)
definition8ѭ块需要您定义
self::
。为避免这种情况,您需要命名模块并删除它。     ,        我已经找到了一种在Rake任务中为方法命名空间的方法,因此同名方法不会冲突。 将每个外部名称空间包装在唯一命名的模块中。
extend Rake::DSL
将您的方法更改为类方法(使用
self.
)。 我已经对此进行了测试,它仍然允许一个rake任务调用或依赖于另一个模块中的另一个rake任务。 例:
module Test
  extend Rake::DSL

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

    def self.test_method(argument)
      ...
    end    
  end
end

module OtherTest
  extend Rake::DSL

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

    def self.test_method(argument,argument2)
      ...
    end
  end
end