创建ruby gem时出现LoadError

时间:2015-07-04 21:33:17

标签: ruby gem rubygems require

我试图创建我的第一个宝石,其结构如下:

riverbattle
├── lib
│   ├── riverbattle
│   │   ├── base.rb
│   │   ├── colorful.rb
│   │   ├── computer.rb
│   │   ├── constants.rb
│   │   ├── exit_error.rb
│   │   ├── field.rb
│   │   ├── game.rb
│   │   ├── human.rb
│   │   ├── invalid_move_error.rb
│   │   ├── move.rb
│   │   ├── player.rb
│   │   ├── version.rb
│   │   └── victory_error.rb
│   └── riverbattle.rb
└── riverbattle.gemspec

当我在目录rivarbattle/lib/riverbattle中并运行命令ruby base.rb时,一切都开始正常工作。

文件base.rb在这里:

require './game'
game = Game.new.start

但是当我尝试使用命令libruby riverbattle.rb目录运行它时,它失败并出现以下错误:

  

/home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in require': cannot load such file -- riverbattle/base (LoadError) from /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in要求'来自riverbattle.rb:1:在`'

文件lib/riverbattle.rb如下所示:

require 'riverbattle/base'

尽管加载失败,我尝试使用以下.gemspec文件构建gem:

# -*- encoding: utf-8 -*-
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "riverbattle/version"

Gem::Specification.new do |s|
    s.name          = 'riverbattle'
    s.date          = '2015-07-04'
    s.summary       = 'Enjoy the game!'
    s.description   = 'A small simple game called the Riverbattle'
    s.platform      = Gem::Platform::RUBY
    s.version       = '0.1.0'
    s.authors       = ["Denis Yakovenko"]
    s.email         = ["yakovenko.denis.a@gmail.com"]
    s.require_paths = ["lib"]
    s.license       = "MIT"
end

成功构建之后,我去了irb并尝试require 'riverbattle'并得到了错误:

  

LoadError:无法加载此类文件 - riverbattle

     

这   /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in require' from /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in要求'来自(irb):1来自   /home/denis/.rvm/rubies/ruby-2.2.1/bin/irb:11:in`'

1)我在require做错了什么,不能加载来自不同目录的文件? (在查看了stackoverflow问题之后,我发现这是$ LOAD_PATH的一些问题,但我无法找到如何修复代码。顺便说一句,这样的require LoadErrors由于某种原因经常发生然后我尝试使用require_relative,有时候会有所帮助)

2)当我试图在irb中创建gem时,由于require的初始问题,错误被提出了,对吧?或者别的什么不对?

3)如果我想将测试文件夹添加到gem中,我可以将文件夹tests添加到根目录并将所有rspec文件复制到那里吗?

更新

当我尝试在RUBYLIB="." ruby riverbattle.rb文件夹中的终端中运行lib时,它给了我这个:

  

RUBYLIB =&#34;&#34; ruby riverbattle.rb   /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in require': cannot load such file -- ./field (LoadError) from /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in要求&#39;从   /home/denis/WEB/Bursa/riverbattle/lib/riverbattle/game.rb:1:in   <top (required)>' from /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in需要&#39;从   /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in require' from /home/denis/WEB/Bursa/riverbattle/lib/riverbattle/base.rb:1:in &#39;从   /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in require' from /home/denis/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in要求&#39;来自riverbattle.rb:1:在`&#39;

1 个答案:

答案 0 :(得分:2)

1。 #require尝试加载绝对路径,如果失败则从$:加载,添加当前目录运行这样的脚本(bash,否则使用适当的方法为shell定义环境变量) :

RUBYLIB="." ruby riverbattle.rb

base.rb要求如下:

require 'riverbattle/game'

2。 请参阅#UPD部分

3。 你为什么不呢? (你的specific problem是什么?)

#UPD

第二个问题是因为你错过了宝石规范中的#files,你的宝石文件中没有包含任何文件,添加如下内容:

s.files = Dir['lib/*.rb'] + Dir['lib/riverbattle/*.rb']

#UPD2

总结一下here是您宝石的工作设置。