如果彼此依赖,如何要求ruby gem中的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果彼此依赖,如何要求ruby gem中的文件相关的知识,希望对你有一定的参考价值。

我有以下结构:

LIB / billomat.rb

require 'dry-configurable'
require 'httparty'

require 'billomat/version'
require 'billomat/account'

module Billomat
  extend Dry::Configurable

  setting :subdomain
  setting :api_key
end

LIB / billomat / base.rb

class Billomat::Base
  include HTTParty
  base_uri "https://#{Billomat.config.subdomain}.billomat.net/api"

  def initialize
    @options = { format: 'json', headers: {
      'X-BillomatApiKey' => Billomat.config.api_key
    } }
  end
end

LIB / billomat / account.rb

require_relative 'base'

class Billomat::Account < Billomat::Base
  def info
    puts Billomat.config.subdomain
    self.class.get('/clients/myself', @options)
  end
end

如果我尝试使用bin/console访问控制台,则会收到错误消息:

lib/billomat/base.rb:3:in `<class:Base>': undefined method `config' for Billomat:Module (NoMethodError)

gem试图加载依赖于使用Billomat.config的base.rb的account.rb,在此它没有准备好。我尝试从require 'billomat/account'删除billomat.rb并再次打开控制台。现在,我实际上可以实例化Billomat.config,但我尝试调用Billomat::Account.new.info我得到另一个错误:

irb(main):005:0> Billomat::Account
NameError: uninitialized constant Billomat::Account

因为当然不需要billomat/account,所以我必须手动要求。

问题是:如何组织代码,以便我可以调用Billomat.configuire {}然后调用Billomat::Account.new.info而不必在我想使用时手动要求它?

答案

Ruby是一种脚本语言,它逐个读取和处理行。只需更改顺序:

LIB / billomat.rb

require 'dry-configurable'
require 'httparty'

module Billomat
  extend Dry::Configurable

  setting :subdomain
  setting :api_key
end

require 'billomat/version'
require 'billomat/account'

以上是关于如果彼此依赖,如何要求ruby gem中的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何检查已安装的 Ruby gem 的所有依赖项是不是满足?

Ruby:自定义 gem 需要其中的模块“要求”

如何在AWS Lambda函数中安装/使用ruby gems?

安装 ruby​​ gem nokogiri 时缺少 libxslt

Ruby(bundle install,bundle update)FAILS无法安装gems http_parser.rb,eventmachine

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?