12

假设我编译自己的新 Ruby(MRI 1.9.3),默认的 LOAD_PATH 是什么,它是如何计算的?

4

2 回答 2

15

在我的机器上,初始加载路径如下所示:

$ ruby -e 'puts $LOAD_PATH'
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.8.0
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.8.0
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin10.8.0

有了grep,对 Ruby 源代码的调查导致了in的定义ruby_initial_load_paths[]version.c(这是在 Ruby 1.9.3 上)。其中第一个适用(既未设置NO_INITIAL_LOAD_PATHRUBY_SEARCH_PATH未设置)是RUBY_SITE_LIB2. 查看该定义上面的定义,我们看到

#define RUBY_SITE_LIB2              RUBY_SITE_LIB    "/"RUBY_LIB_VERSION

反过来:_

#define RUBY_SITE_LIB RUBY_LIB_PREFIX"/site_ruby"

在这个定义链之后,很明显这对应于我上面加载路径中的第一个条目。类似地,进入此变量的其他常量对应于其他加载路径条目。

ruby_initial_load_paths[]变量用于 in ruby_init_loadpath_safe()ruby.c其中为进程设置了实际的加载路径。

因此,您的问题的答案是#define,根据构建的配置方式,初始加载路径是在编译时使用一些 s 设置的。

于 2012-05-31T21:55:02.310 回答
0

您的编译在基于 *nix 的系统上创建一个 lib 目录,通常是

/usr/lib/ruby/X.Y.Z

XYZ 代表您的 ruby​​ C api 版本的版本号。

于 2012-05-31T16:56:27.280 回答