2

次のファイル構造に基づいて構築されたカスタム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が含まれています。

#!/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'」です。

IRBでgemをうまく使用できるのに、なぜこれがスクリプトで機能しないのか理解できません。

私はSOでこの質問を見ましたが、同じ問題を完全に修正することはできませんでした。

どんな助けでもいただければ幸いです。

編集:いくつかの紛らわしいファイル名を削除し、それらを置き換えました。

4

1 に答える 1

3

ロードしようとしてscommonいますが、そのファイルはロードパスにありません。'フル'パスを使用できます。require 'commenfiles/scommon'

これは、ファイルのディレクトリがロードパスの一部ではないために発生することに注意してください。代わりに使用することをお勧めしrequire_relativeます(ロードパスは使用しません):require_relative 'scommon'

于 2012-05-23T09:31:39.970 に答える