Giả sử tôi biên dịch Ruby mới của riêng tôi (MRI 1.9.3), LOAD_PATH mặc định là gì và tính toán như thế nào?Xác định Ruby LOAD_PATH mặc định như thế nào?
Trả lời
Trên máy tính của tôi, con đường tải ban đầu trông như thế này:
$ 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
vũ trang với grep
, một cuộc điều tra vào nguồn của Ruby dẫn đến definition of ruby_initial_load_paths[]
in version.c
(đây là trên Ruby 1.9.3). Đầu tiên trong số này áp dụng (không phải NO_INITIAL_LOAD_PATH
hoặc RUBY_SEARCH_PATH
đã được đặt) là RUBY_SITE_LIB2
. Nhìn vào định nghĩa ở trên định nghĩa rằng we see:
#define RUBY_SITE_LIB2 RUBY_SITE_LIB "/"RUBY_LIB_VERSION
và in turn:
#define RUBY_SITE_LIB RUBY_LIB_PREFIX"/site_ruby"
Tiếp theo chuỗi này định nghĩa, nó trở nên rõ ràng rằng điều này tương ứng với sự xâm nhập đầu tiên trong con đường tải của tôi ở trên. Tương tự, các hằng số khác đi vào biến này tương ứng với các mục nhập đường dẫn tải khác.
Biến số ruby_initial_load_paths[]
được sử dụng trong ruby_init_loadpath_safe()
in ruby.c
, nơi đường dẫn tải thực tế được thiết lập cho quy trình.
Vì vậy, câu trả lời cho câu hỏi của bạn là đường dẫn tải ban đầu được đặt tại thời gian biên dịch với một số #define
giây, theo cách xây dựng đã được định cấu hình.
biên soạn của bạn tạo ra một thư mục lib trên hệ thống * nix dựa nó thường là
/usr/lib/ruby/X.Y.Z
X.Y.Z đại diện cho số phiên bản của ruby phiên bản C api của bạn.
Không, số phiên bản có đại diện cho phiên bản API C của Ruby –