2010-08-29 40 views
12

Tôi có một mã Ruby với các lớp khác nhau trong một vài tệp. Trong một tệp, tôi bắt đầu thực hiện. Tệp này require của các tệp khác của tôi.Ruby yêu cầu đường dẫn

  • Đây có phải là cách hay để bắt đầu mã ruby ​​không?
  • Khi tôi chạy mã từ liên kết tượng trưng, ​​ví dụ DIR2/MyRubyCode là liên kết đến tệp chính DIR1/MyRubyCode.rb, thì yêu cầu của tôi sẽ không thành công. Tôi giải quyết vấn đề bằng cách thêm đường dẫn DIR1 đến $LOAD_PATH trước require, nhưng tôi nghĩ sẽ có nhiều cách tốt hơn để thực hiện điều đó. Bạn có bất cứ đề nghị về điều đó?

Trả lời

16

Nếu bạn muốn kiểm tra xem một file Ruby là 'require 'ed hoặc thực hiện với' ruby MyRubyCode.rb', đánh dấu vào __FILE__ liên tục.

# If the first argument to `ruby` is this file. 
if $0 == __FILE__ 
    # Execute some stuff. 
end 

Theo yêu cầu/$ LOAD_PATH vấn đề, bạn luôn có thể sử dụng đường dẫn tương đối trong câu lệnh yêu cầu. Ví dụ:

# MyRubyCode.rb 
require "#{File.dirname(__FILE__)}/foo_class" 
require "#{File.dirname(__FILE__)}/bar_module" 

Trong đó sẽ bao gồm các foo_class.rbbar_module.rb file trong cùng thư mục với MyRubyCode.rb.

+1

Cảm ơn nhưng nếu tôi yêu cầu với File.dirname (__ FILE__), khi tôi khởi chạy mã bằng bí danh, nó cũng cố gắng bao gồm từ '.' và tôi vẫn gặp lỗi 'không tải tệp như vậy'. –

+1

Đó là chính xác. Bạn sẽ phải lấy mục tiêu của liên kết tượng trưng (nó sẽ thay thế cho 'File.dirname()'). Hãy xem bài đăng này để biết một số cách làm khác nhau: http://stackoverflow.com/questions/1237939/ruby-how-do-i-get-the-target-of-a-symlink –

+2

Cảm ơn. Nó hoạt động tốt với '$ LOAD_PATH << File.dirname (Pathname.new (File.expand_path (__ FILE __)). Realpath.to_s) .to_s'. –

6

Tôi biết đây là một câu hỏi cũ, nhưng có một câu trả lời được cập nhật với nó, và tôi muốn đăng nó:

Bắt đầu từ một phiên bản mới hơn của Ruby (Tôi không chắc chắn khi nào), bạn có thể yêu cầu các file trong cùng thư mục bằng cách sử dụng những điều sau đây:

require './foo_class' 
require './bar_module' 

và nó sẽ tải file gọi foo_class.rbbar_module.rb trong cùng thư mục.

Để kiểm tra xem tệp của bạn có đang là require d hoặc chạy bình thường hay không, hãy kiểm tra câu trả lời khác.

+2

Câu trả lời này không giải quyết trường hợp sử dụng trong câu hỏi gốc, bởi vì nó vẫn thất bại nếu tệp ruby ​​đang được gọi từ một liên kết tượng trưng hoặc nằm trên đường dẫn của người dùng. – Nathan

17

Nếu bạn đang sử dụng Ruby 1.9 trở lên, người dùng require_relative cho các phụ thuộc của bạn.

require_relative 'foo_class' 
require_relative 'bar_module' 
Các vấn đề liên quan