【问题标题】:Custom gem works in irb, not in a ruby script自定义 gem 在 irb 中工作,而不是在 ruby​​ 脚本中
【发布时间】:2012-05-23 06:28:22
【问题描述】:

我有一个基于以下文件结构的自定义 gem:

something/common/searchcommon.gemspec

something/common/lib/searchcommon.rb

something/common/lib/commonfiles/scommon.rb

something/common/lib/commonfiles/token_stream.rb

something/common/lib/commonfiles/rbbi.rb

我的 gemspec 文件如下所示:

Gem::Specification.new do |s|
  s.name        = 'searchcommon'
  s.version     = '0.0.0'
  s.date        = '2012-04-28'
  s.summary     = "Search Common classes"
  s.description = "Contains the common classes for search"
  s.authors     = ["some author"]
  s.email       = 'x@x.com'
  s.files       = ["lib/searchcommon.rb","lib/commonfiles/scommon.rb","lib/commonfiles/rbbi.rb","lib/commonfiles/token_stream.rb"]
end

我能够毫无问题地构建和安装 gem。

它也适用于 irb:

>> require 'searchcommon'

=> true

但是,我有一个需要这个 gem 的脚本。该脚本包含如下 gem:

#!/usr/local/bin/ruby
require 'rubygems'
require 'searchcommon'

我得到的错误引发了以下堆栈跟踪:

/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- scommon (LoadError)
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
    from /usr/local/lib/ruby/gems/1.8/gems/searchcommon-0.0.0/lib/commonfiles/rbbi.rb:1
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
    from /usr/local/lib/ruby/gems/1.8/gems/searchcommon-0.0.0/lib/searchcommon.rb:1
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:60:in `gem_original_require'
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:60:in `require'
    from ./mapper.rb:3

错误的行是 lib/commonfiles/searchcommon.rb 中的 "require 'commonfiles/rbbi'"

rbbi.rb 中出现此错误的行是 "require 'scommon'",它也存在于同一文件夹中。

当我能够将 gem 与 IRB 一起使用时,我无法理解为什么这在脚本中不起作用。

我查看了this question on SO,但它并没有完全解决同样的问题。

任何帮助将不胜感激。

编辑:删除了一些令人困惑的文件名并替换了它们。

【问题讨论】:

  • 脚本中有searchcommon,错误中有search_common。那么它是什么?
  • 'searchcommon' 是 gem 的名称。 “search_common”是“rbbi.rb”等文件使用的内部库文件。
  • 更改了文件名以防止混淆。

标签: ruby rubygems irb


【解决方案1】:

您正在尝试加载scommon,但该文件不在加载路径中。您可以使用“完整”路径:require 'commenfiles/scommon'

请注意,发生这种情况是因为文件的目录不是加载路径的一部分。我建议改用require_relative(它不使用加载路径):require_relative 'scommon'

【讨论】:

  • 谢谢!那解决了它。我在每个地方都使用了“完整”路径。我得到了 require_relative 的“方法缺失”错误,但我怀疑那是因为我使用的是 ruby​​ 1.8.7。再次感谢。
  • 是的,require_relative >= 1.9.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2012-11-18
  • 1970-01-01
  • 2012-09-29
  • 2014-10-11
  • 2022-10-19
  • 1970-01-01
相关资源
最近更新 更多