未定义的方法`configure'对于MyGem:模块

时间:2017-03-05 20:46:19

标签: ruby-on-rails ruby configuration rubygems

问题的背景

  • If not dtTa_Enc.find("codTa = " + lst1.valuemember) Then dtTa_Enc.Rows.Add(lstTabelas.ValueMember, lstTabelas.GetItemText(lstTabelas.SelectedItem)) End If 运行正常
  • gem 'leanpirates-aarrr', '~> 0.1.1', :path => "/src/gem-aarrr"显示了生成器rails g
  • lean_pirates:aarrr:install
  • 下成功创建了初始化程序
  • 但尝试配置gem
  • 时初始值设定项 FAILS

初始化程序:leanpirates_aarrr.rb

config/initializers/leanpirates_aarrr.rb

宝石定义文件:aarrr.rb

LeanPirates::Aarrr.configure do |config|
  config.api_server     = "http://localhost:3000"
  config.startup_key    = Rails.configuration.leanpirates_aarrr.startup_key
  config.startup_secret = Rails.application.secrets.leanpirates_startup_secret
end

错误

# (...) module LeanPirates module Aarrr class << self attr_writer :configuration end def self.configuration @configuration ||= LeanPirates::Aarrr::Domain::Configuration.new end def self.reset @configuration = LeanPirates::Aarrr::Domain::Configuration.new end def self.configure yield(configuration) end end end

/src/app-ebusiness-v3/config/initializers/leanpirates_aarrr.rb:1:in <top (required)>: undefined method 'configure' for LeanPirates::Aarrr:Module (NoMethodError)

这是来自https://github.com/lean-pirates/gem-aarrr/tree/simplification(分支/src/app-ebusiness-v3/config/initializers/leanpirates_aarrr.rb:1:in `<top (required)>': undefined method `configure' for LeanPirates::Aarrr:Module (NoMethodError) from /home/ubuntu/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/dependencies.rb:287:in `load' from /home/ubuntu/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/dependencies.rb:287:in `block in load' from /home/ubuntu/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/dependencies.rb:259:in `load_dependency' from /home/ubuntu/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.2/lib/active_support/dependencies.rb:287:in `load' (...)

的开源 LeanPirates AARRR

2 个答案:

答案 0 :(得分:1)

Rails中的Autoloader功能非常方便,它可以自动处理大量事情,但它也不是很聪明。如果已经定义了名称空间,则不会加载其他文件。

作为宝石,您有义务要求您的图书馆正常运作所需的任何和所有支持模块或课程。

以下是lib/gem/aarrr/version.rb中的问题:

module LeanPirates
  module Aarrr
      VERSION = '0.1.1'
  end
end

现在LeanPirates::Aarrr已经定义,因此自动加载器不需要额外的工作。因此,您的lib/gem/aarrr.rb永远不会加载。

要解决此问题,您需要避免创建该命名空间路径。您还应确保在require_paths文件中正确设置了.gemspec,以便正确引用lib/gem。现在你必须require 'gem/aarrr',这真的令人困惑和笨拙。

我通常在主gem目录中设置一个普通的VERSION文件,该文件只有版本字符串。如果gemspec需要,File.read可以按需阅读,或者您可以使用rake任务将其烘焙到.gemspec。我更喜欢后一种方法,因为在其中使用大量任意代码的.gemspec总是过于复杂化。

答案 1 :(得分:1)

问题已解决

@tadman带着他的解释指导我正确的方向(非常感谢),虽然问题比我最初评估的要大。

Rails Autoloader 无法加载我的文件。 为什么?因为我试图组织它们。

问题是

命名空间!很久以前,当gem启动时,将所有内容移动到/ lib / gem文件夹是合理的。然而,它被证明是问题的根源。

如果命名空间与文件夹结构不匹配,自动加载器在加载文件时遇到问题,并且它们没有被我的宝石类等识别出来。

命名空间是如何排序的?

当你在做宝石时,请确保你理解了良好的命名空间。在我的例子中,使用以下命令行生成插件解决了问题:

rails plugin new lean_pirates-aarrr

上面这一行创建的东西应该是自动加载器的选择方式。这不是我们可以抱怨的东西:Rails遵循了很多“约定惯例”范式。

我的结束结构如下: (https://github.com/lean-pirates/gem-aarrr/tree/simplification

- lib/
  -> generators/
    -> lean_pirates/
      -> aarrr/
        -> install/
          -> routines/*.rb
          -> templates/*.rb
          -> *.rb
  -> lean_pirates/
    -> aarrr/
      -> domain/*.rb
      -> helpers/*.rb
      -> *.rb

我会更乐意在根目录上创建/ generator和/ gem,我确信它是可能的,但我真的不想与大会竞争,所以我很高兴将其保留为是,至少现在。

如果您遇到同样的问题,修复文件夹结构可能有助于 Autoloader 查找您的文件。更改它,或相应地进行配置。