创建 ruby gem 时出现 LoadError

LoadError when creating ruby gem

我正在尝试创建我的第一个 gem,这是它的结构:

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

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

/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:inrequire' from riverbattle.rb:1:in `'

文件 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: cannot load such file -- riverbattle

from /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:inrequire' from (irb):1 from /home/denis/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `'


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

2) 当我尝试在 irb 中启动 gem 时,出现错误是因为 require 的那些初始问题,对吧?或者其他什么地方不对?

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

更新

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

RUBYLIB="." 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:inrequire' from /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:inrequire' from /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 ' from /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:inrequire' from riverbattle.rb:1:in `'

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

RUBYLIB="." ruby riverbattle.rb

在您的 base.rb 中要求如下:

require 'riverbattle/game'

2。 参见#UPD 部分

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

#UPD

第二个问题是因为您在gem规范中遗漏了#files,您的gem文件中没有包含任何文件,添加如下内容:

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

#UPD2

总结一下 here 正在为您的 gem.

设置工作