我试图创建我的第一个宝石,其结构如下:
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
但是当我尝试使用命令lib
从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 -- 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 ="" 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:inrequire' 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: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
要求&#39;来自riverbattle.rb:1:在`&#39;
答案 0 :(得分:2)
1。
#require
尝试加载绝对路径,如果失败则从$:
加载,添加当前目录运行这样的脚本(bash,否则使用适当的方法为shell定义环境变量) :
RUBYLIB="." ruby riverbattle.rb
在base.rb
要求如下:
require 'riverbattle/game'
2。 请参阅#UPD部分
3。 你为什么不呢? (你的specific problem是什么?)
第二个问题是因为你错过了宝石规范中的#files
,你的宝石文件中没有包含任何文件,添加如下内容:
s.files = Dir['lib/*.rb'] + Dir['lib/riverbattle/*.rb']
总结一下here是您宝石的工作设置。