Пользовательский гем работает в irb, а не в скрипте ruby

У меня есть собственный драгоценный камень, который построен на следующей структуре файлов:

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       = '[email protected]'
  s.files       = ["lib/searchcommon.rb","lib/commonfiles/scommon.rb","lib/commonfiles/rbbi.rb","lib/commonfiles/token_stream.rb"]
end

Я могу собрать и установить драгоценный камень без проблем.

Это также работает на irb:

>> require 'searchcommon'

=> true

Однако у меня есть скрипт, которому понадобится этот драгоценный камень. Сценарий включает в себя драгоценный камень следующим образом:

#!/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

Ошибочная строка — это "require 'commonfiles/rbbi'" внутри lib/commonfiles/searchcommon.rb.

Строка внутри rbbi.rb с этой ошибкой называется "require 'scommon'", которая также присутствует в той же папке.

Я не могу понять, почему это не сработает в сценарии, когда я могу прекрасно использовать драгоценный камень с IRB.

Я просмотрел этот вопрос на SO, но это не так вполне решить ту же проблему.

Любая помощь будет оценена по достоинству.

Редактировать: удалены и заменены некоторые запутанные имена файлов.


person Nikhil    schedule 23.05.2012    source источник
comment
У вас есть searchcommon в сценарии и search_common в ошибке. Так что это?   -  person Michael Slade    schedule 23.05.2012
comment
«searchcommon» — это имя драгоценного камня. «search_common» — это файл внутренней библиотеки, используемый такими файлами, как «rbbi.rb».   -  person Nikhil    schedule 23.05.2012
comment
Изменено имя файла, чтобы не было путаницы.   -  person Nikhil    schedule 23.05.2012


Ответы (1)


Вы пытаетесь загрузить scommon, но этот файл не лежит в пути загрузки. Вы можете использовать «полный» путь: require 'commenfiles/scommon'

Обратите внимание, что это происходит потому, что каталог файла не является частью пути загрузки. Вместо этого я рекомендую использовать require_relative (он не использует путь загрузки): require_relative 'scommon'

person J-_-L    schedule 23.05.2012
comment
Спасибо за это! Это исправило это. Я использовал «полный» путь везде. Я получил ошибку «отсутствует метод» для require_relative, но я подозреваю, что это потому, что я на Ruby 1.8.7. Еще раз спасибо. - person Nikhil; 23.05.2012
comment
Да, require_relative = 1.9.2 - person J-_-L; 23.05.2012