ruby gem require_relative 无法加载此类文件

ruby gem require_relative cannot load such file

我在网上和 SO 上四处张望,这个问题的大部分答案都说我应该使用 require_relative,但我正在使用它,所以我不知道可能是什么问题。我正在尝试构建 ruby gem,我的文件夹结构如下所示

--xmlmc-rb/
  --lib/
    --xmlmc-rb/
        api.rb
        interface.rb
        version.rb
      xmlmc-rb.rb

xmlmc-rb.rb 中,我需要像这样 xmlmc-rb/ 目录下的所有三个文件

require_relative "xmlmc-rb/version"
require_relative "xmlmc-rb/interface"
require_relative "xmlmc-rb/api"
require 'net/http'
require 'nokogiri'
require 'base64'

但我一直收到错误消息

/Library/Ruby/Gems/2.0.0/gems/xmlmc-rb-0.1.1/lib/xmlmc-rb.rb:2:in `require_relative': cannot load such file -- /Library/Ruby/Gems/2.0.0/gems/xmlmc-rb-0.1.1/lib/xmlmc-rb/interface (LoadError)
from /Library/Ruby/Gems/2.0.0/gems/xmlmc-rb-0.1.1/lib/xmlmc-rb.rb:2:in `<top (required)>'
from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:128:in `require'
from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:128:in `rescue in require'
from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:39:in `require'
from xmlmc_test.rb:1:in `<main>'

当我手动将所有文件复制到主 rb 文件时,一切正常。最初我认为这是一个命名错误,因为 xmlmc-rb/ 下的文件大小写不统一,但我修复了这个问题,将它们全部设为小写名称,同样的错误仍然存​​在。

因为我不太了解你的 gem 名字,我会告诉你我是怎么做的:

require "password_control/scrypt/ScryptHash"

在我的例子中,我在 password_control 文件夹中有另一个目录。但是,如果我的文件位于 password_control 目录中,则要求为:

require "password_control/ScryptHash"

我通过复制 interface.rb 删除文件并重新创建文件中的所有内容来完成此工作。奇怪为什么会这样。

我有同样的错误building a Ruby Gem。 我构建并安装了 gem:

gem build <gemname>.gemspec
gem install <gemname>-0.0.1.gem

我检查了 gem 的安装位置:

gem env home
gem list -d

我试图在交互式 Ruby (IRB) 中加载 gem:

irb
require '<gemname>'

导致错误:

LoadError: cannot load such file -- /Users/<username>/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/<gemname>-0.0.1/lib/my_gem_subdirectory/module_name

我在 lib 目录的 Ruby 文件中使用 require_relative './my_gem_subdirectory/module_name' 从子目录导入模块和 类。

我通过更新 Gemspec 解决了错误。gemspec 以包含所有文件和子目录。最初我只有 s.files = ['lib/<gemname>.rb']。但是我阅读了文档http://guides.rubygems.org/specification-reference/#files并将其更改为:

Gem::Specification.new do |s|
  ...
  s.files       = ['lib/discrete_math.rb']
  s.files       += Dir['lib/*.rb']
  s.files       += Dir['lib/my_gem_subdirectory/**/*']
  ...
end