我在网上搜索了这个问题并且这个问题的大部分答案都说我应该使用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/
下的文件的大小不均匀,但我修复了它,使它们全部为小写名称并且同样的错误仍然存在。
答案 0 :(得分:0)
由于我不太了解你的宝石名称,我会告诉你我是怎么做的:
require "password_control/scrypt/ScryptHash"
在我的情况下,我在password_control文件夹中有另一个目录。但是如果我的文件在password_control目录中,则require将是:
require "password_control/ScryptHash"
答案 1 :(得分:0)
我通过将所有内容复制出interface.rb来删除文件并重新创建它。奇怪为什么会这样。
答案 2 :(得分:0)
我遇到了同样的错误building a Ruby Gem。 我构建并安装了gem:
gem build <gemname>.gemspec
gem install <gemname>-0.0.1.gem
我检查了宝石的安装位置:
gem env home
gem list -d
我尝试在Interactive 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