【问题标题】:LoadError when creating ruby gem创建红宝石宝石时的LoadError
【发布时间】: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.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'来自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:in require' 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: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' 来自 Riverbattle.rb:1:in `'

【问题讨论】:

标签: ruby gem rubygems require


【解决方案1】:

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 设置工作。

【讨论】:

  • 1.我尝试从lib 文件夹在我的终端中运行此命令,它给了我更长的错误(请参阅问题的更新)。如果我将require 更改为base.rb,它就会停止工作,我的意思是正确的路径应该是require './game',因为base 文件的当前目录是lib/riverbatle 2. 不,我确实安装了gem :) 你认为这只是我的电脑的问题吗?如果我在另一台电脑上安装 gem,它实际上可以正常工作吗?
  • 当您 require './game' 从当前目录查找时,您的路径解析为不存在的 lib/game.rb,当您 require 'riverbattle/game' 它解析为 [path to your gem directory]/lib/riverbattle/game.rb 因为 the lib directory is added to the load path by rubygems
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多