Почему метод автозагрузки не может найти файл в моей библиотеке? - PullRequest
1 голос
/ 28 апреля 2011

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

|~lib/  
| |~renren_api/  
| | |-authentication.rb  
| | |-http_adapter.rb  
| | \-signature_calculator.rb  
| \-renren_api.rb  
|+spec/  
|-README  
\-renren-api.gemspec  

Я пишу "lib / renren-api.rb" следующим образом. Rack вдохновляют меня.

module RenrenAPI

  VERSION = [0, 3, 1]

  def self.version
    VERSION * "."
  end

  autoload :Authentication, "renren_api/authentication"
  autoload :SignatureCalculator, "renren_api/signature_calculator"
  autoload :HTTPAdapter, "renren_api/http_adapter"

end

Почему метод автозагрузки не может найти нужный файл, а Rack может?

ruby-1.9.2-head :001 > require "renren_api"
 => true 
ruby-1.9.2-head :002 > RenrenAPI::Authentication
LoadError: no such file to load -- renren_api/authentication
    from (irb):2
    from /Users/siegfried/.rvm/rubies/ruby-1.9.2-head/bin/irb:16:in `<main>'
ruby-1.9.2-head :003 > RenrenAPI::HTTPAdapter
LoadError: no such file to load -- renren_api/http_adapter
    from (irb):3
    from /Users/siegfried/.rvm/rubies/ruby-1.9.2-head/bin/irb:16:in `<main>'
# The following split into newlines to make more readable
ruby-1.9.2-head :004 > $:
 => ["/Users/siegfried/.rvm/gems/ruby-1.9.2-head/gems/renren-api-0.3.1/lib", 
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1", 
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", 
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby",
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/vendor_ruby/1.9.1",
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0",
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/vendor_ruby",
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1",
"/Users/siegfried/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 

Мой файл gemspec следующий.1012 *

Gem::Specification.new do |spec|
  spec.name = "renren-api"
  spec.version = "0.3.1"
  spec.summary = "a library to request Renren's API"
  spec.description = <<-EOF
  renren-api provides capability to request the service of Renren Social Network.
  EOF
  spec.files = Dir["{lib/*,spec/*}"] + %w{README}
  spec.require_path = "lib"
  spec.extra_rdoc_files = %w{README}
  spec.test_files = Dir["spec/*_spec.rb"]
  spec.author = "Lei, Zhi-Qiang"
  spec.email = "#my email"
  spec.homepage = "https://github.com/siegfried/renren-api"
end

Когда требуется "renren_api / authentication".

ruby-1.9.2-head :001 > require "renren_api/authentication"
LoadError: no such file to load -- renren_api/authentication
    from <internal:lib/rubygems/custom_require>:29:in `require'
    from <internal:lib/rubygems/custom_require>:29:in `require'
    from (irb):1
    from /Users/siegfried/.rvm/rubies/ruby-1.9.2-head/bin/irb:16:in `<main>'

Добавить ".rb" не поможет.

ruby-1.9.2-head :001 > require "renren_api"
 => true 
ruby-1.9.2-head :002 > RenrenAPI::Authentication
LoadError: no such file to load -- renren_api/authentication.rb
    from (irb):2
    from /Users/siegfried/.rvm/rubies/ruby-1.9.2-head/bin/irb:16:in `<main>'

1 Ответ

0 голосов
/ 29 апреля 2011

Я обнаружил, что проблема в том, что я неправильно указал gemspec.

spec.files = Dir["{lib/*,spec/*}"] + %w{README}

Файл не был упакован в "lib / renren_api /".Чтобы изменить это, это решит эту проблему.

spec.files = Dir["{lib/**/*,spec/*}"] + %w{README}
...