铁轨项目中的耙子范围?

时间:2011-05-30 04:31:05

标签: ruby-on-rails rake

我在一个正在研究的项目中使用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

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

这只是一种必要的邪恶吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:0)

visibility: visible|hidden|collapse|initial|inherit;
在任何定义之前,

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) 块需要您Module.new do end。为避免这种情况,您需要命名模块并将其删除。

答案 2 :(得分:0)

我找到了一种方法来命名Rake任务中的方法,因此同名的方法不会发生冲突。

  1. 将每个外部命名空间包装在一个具有唯一名称的模块中。
  2. extend Rake::DSL
  3. 将您的方法更改为类方法(使用self.)。
  4. 我已经测试了这个,它仍然允许一个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