【发布时间】:2015-07-04 21:33:17
【问题描述】:
我正在尝试创建我的第一个 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.rb 从lib 目录运行它时,它会失败并出现以下错误:
/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'来自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:inrequire' from (irb):1 from /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 文件复制到那里吗?
更新
当我尝试在终端的 lib 文件夹中运行 RUBYLIB="." ruby riverbattle.rb 时,它给了我这个:
RUBYLIB="."红宝石河战.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' 来自 /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' 来自 /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/base.rb:1:in' 来自 /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:inrequire' 来自 Riverbattle.rb:1:in `'
【问题讨论】: