为什么我现在的工作目录不在我的Ruby路径上?
考虑:
~:499$ irb
ruby-1.9.2-p136 :002 > puts $:
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0
=> nil
这真让我感到困扰,因为我觉得需要不起作用(虽然我是红宝石):
require 'some_file_that_I_know_darn_well_is_in_pwd.rb'
如果我将'.'
追加到最后,则需要按照我的预期运作。
我错过了什么?
更新
精氨酸!现在我遇到了一个新问题。考虑:
ruby-1.9.2-p136 :010 > `ls`
=> "start.rb\n"
ruby-1.9.2-p136 :011 > require_relative 'start'
LoadError: cannot infer basepath
from (irb):11:in `require_relative'
from (irb):11
from /Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'
现在怎么了?
答案 0 :(得分:75)
在Ruby 1.9.2中引入的权力an explicit change,以便工作目录不再位于Ruby路径中。在我了解require_relative
之前,我认为这是天启和可怕的事情。我的应用程序看起来像这样:
require 'some_gem'
require 'another_gem'
require_relative 'lib/init'
然后lib/init.rb
可以:
require_relative 'lib1' # this is lib/lib1.rb
require_relative 'lib2' # this is lib/lib2.rb
这是蜜蜂的膝盖,解决了我曾经遇到的各种问题,需要来自不同工作目录的相同文件。
编辑:很遗憾(由于我不知道并且没有查看的原因)require_relative
在irb中不起作用。为此你可以:
$: << '.'
或$:.unshift '.'
或您可以改为使用load 'myfile.rb'
或require './myfile'
:
irb(main):001:0> Dir['*.rb']
=> ["a.rb", "bar.rb", "foo.rb", "prime.rb", "tmp.rb"]
irb(main):002:0> require 'a'
LoadError: no such file to load -- a
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from (irb):2
from /usr/local/bin/irb:12:in `<main>'
irb(main):003:0> require_relative 'a'
LoadError: cannot infer basepath
from (irb):3:in `require_relative'
from (irb):3
from /usr/local/bin/irb:12:in `<main>'
irb(main):004:0> load 'a.rb'
a
=> true
irb(main):005:0> require './a'
a
=> true
答案 1 :(得分:3)
您可以使用require_relative,假设它符合您的需要。
答案 2 :(得分:1)
确保环境变量“RUBYLIB”设置了所有目录路径,您将在其中找到自定义* .rb代码。它也让我疯了。