Ruby的require问题(与$LOAD_PATH有关)

4

我试图使用刚刚安装的宝石(通过sudo gem install excelsior)进行如下操作:

require 'rubygems'

require 'excelsior'

...

在irb中这样做没有问题,但当我将完全相同的代码放入.rb文件中并尝试用ruby运行它时,我得到了<internal:lib/rubygems/custom_require>:29:in require': no such file to load -- excelsior (LoadError)的错误。

我想这可能与加载路径有关。在irb和ruby中,加载路径显然完全不同(我使用的是Mac系统,不记得我安装的ruby版本是怎么安装的了)。

那么,如何配置ruby以具有与irb相同的加载路径呢?

额外提供一点信息:一些宝石可以工作,但不是全部 :S


1
Ruby,Gem和IRB是否都是同一个安装包的一部分?使用“which”命令进行检查。此外,您可以从bash或ruby脚本中修改$LOAD_PATH。 - Jeremy
1
非常相似的问题:https://dev59.com/S1fUa4cB1Zd3GeqPKrzS#6181589 - Andrew Grimm
4个回答

2
您可以轻松地检查您的irb加载路径:
您可以轻松地检查您的irb加载路径:
irb(main):001:0> $LOAD_PATH

然后,您可以通过使用-I选项(可以多次使用)来识别缺少的目录并将其包含在Ruby中:

ruby -I missing_dir_1 -I missing_dir_2 your_script.rb

编辑: 有一种可能性,尽管我还没有测试过,通过使用sudo安装Excelsior gem,您将其放置在一个对于不带sudo运行的ruby不可访问的目录中。尝试sudo ruby your_script.rb


有没有一种方法可以在不必在调用Ruby命令时指定所有内容的情况下添加到负载路径中?比如说一个配置文件或者其他什么东西? - Nat
在执行 require excelsior 前,使用 $LOAD_PATH << "directory_path" 应该就足够了。 - maro
那个不起作用,看起来很奇怪。在IRB中,我为p $LOAD_PATH输出的每个项目添加了一个$LOAD_PATH << "directory_path"语句,但在require 'excelsior'行之前它仍然出现相同的错误。 - Nat
使用sudo运行Ruby似乎没有任何区别 :( - Nat

1

马洛说的话。

你也应该尝试:

ruby -e 'puts $LOAD_PATH' 

...查看与irb的区别。

编辑:您是否安装了两个不同版本的Ruby?请尝试:

type -a ruby
type -a irb

查看它们是否链接到另一个可执行文件,例如 'irb1.8'。


可能我有两个版本的Ruby,尽管irb和ruby都在/usr/bin和/usr/local/bin中。加载路径完全不同。有没有办法改变这个? - Nat
看起来你有两个版本的Ruby:一个在/usr/bin中,另一个在/usr/local/bin中。如果你运行ls -l /usr/local/bin/ruby /usr/bin/ruby,你可能会发现这些文件实际上是指向更长、更有趣的名称(如ruby1.8)的符号链接,这应该告诉你哪一个是你想要使用的。你需要确保从同一个版本运行irb和ruby。如果所有这些之后,你的加载路径仍然不同,请检查$RUBYLIB环境变量;那就是load_path应该来自的地方。 - Andy

1

为了确定这两个可执行文件是否是不同版本的 Ruby(正如一些人所怀疑的那样),请让它执行以下操作:

puts RUBY_VERSION

啊,没错,irb是1.8.7版本的,而ruby是1.9.2版本的……所以我猜我可以找到适用于1.8.7版本的ruby工具并使用它,但是我该如何让irb使用1.9.2版本,并让1.9.2版本与所有我的gems兼容呢? - Nat
我找到了1.8.7版本的Ruby工具,它可以“require excelsior”,但是在一些其他行上会出现问题,这些问题不是无法解决,但也不太方便:( 你有什么想法如何让gems与更新的Ruby兼容? - Nat
问题可能与多个安装有关。最终,我通过安装rvm并设置新的ruby和gems环境来解决了它。 - Nat

0
我的猜测是irb和ruby以某种方式运行不同的ruby版本。gem env也可能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接