【问题标题】:Scope of rakes in a rails project?轨道项目中的耙子范围?
【发布时间】:2016-01-14 00:19:09
【问题描述】:

在我正在处理的项目中,我使用 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 文件的顶部。这有点令人困惑和丑陋。

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails rake


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:
    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 块需要你 self:: 在任何定义之前。为避免这种情况,您需要命名模块并将其删除。

    【讨论】:

      【解决方案3】:

      我想出了一种方法来命名 Rake 任务中的方法,这样同名方法就不会发生冲突。

      1. 将每个外部命名空间包装在一个唯一命名的模块中。
      2. extend Rake::DSL
      3. 将您的方法更改为类方法(使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 2017-05-05
        相关资源
        最近更新 更多