【发布时间】:2012-06-05 23:08:18
【问题描述】:
假设我编译自己的新 Ruby (MRI 1.9.3),默认的 LOAD_PATH 是什么,它是如何计算的?
【问题讨论】:
假设我编译自己的新 Ruby (MRI 1.9.3),默认的 LOAD_PATH 是什么,它是如何计算的?
【问题讨论】:
在我的机器上,初始加载路径如下所示:
$ 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 源代码的调查导致definition of ruby_initial_load_paths[] in version.c(这是在Ruby 1.9.3 上)。第一个适用的(NO_INITIAL_LOAD_PATH 或 RUBY_SEARCH_PATH 均未设置)是 RUBY_SITE_LIB2。查看上面那个定义we see的定义:
#define RUBY_SITE_LIB2 RUBY_SITE_LIB "/"RUBY_LIB_VERSION
和in turn:
#define RUBY_SITE_LIB RUBY_LIB_PREFIX"/site_ruby"
按照这个定义链,很明显这对应于我上面加载路径中的第一个条目。同样,进入此变量的其他常量对应于其他加载路径条目。
ruby_initial_load_paths[] 变量用于ruby_init_loadpath_safe() in ruby.c,其中为进程设置了实际加载路径。
因此,您的问题的答案是,初始加载路径是在编译时设置的,根据构建的配置方式,使用了一些 #defines。
【讨论】:
你的编译创建一个lib目录 在基于 *nix 的系统上,它通常是
/usr/lib/ruby/X.Y.Z
X.Y.Z 代表你的 ruby C api 版本的版本号。
【讨论】: