创建 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.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:in
require' 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:in
require' 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:in
require' 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: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 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:in
require' 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.
设置工作
我正在尝试创建我的第一个 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:in
require' 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:in
require' 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:in
require' 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: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 /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: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 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.
设置工作