2011-12-14 27 views
15

Làm cách nào để yêu cầu tệp từ thư mục hiện tại?Ruby: làm thế nào để "yêu cầu" một tập tin từ thư mục làm việc hiện tại?

Tôi có một tệp có tên là sql_parser.rb có chứa một lớp học. Tôi muốn bao gồm này trong tập tin khác cũng trong cùng một thư mục, vì vậy tôi đã sử dụng:

require 'sql_parser' 

Đó không khi tôi chạy từ thư mục đó:

LoadError: no such file to load -- sql_parser 

tôi đã cố gắng sử dụng IRB trong thư mục nơi này tập tin tồn tại và yêu cầu nó từ đó, nhưng có cùng một vấn đề.

+1

Xem thêm http://stackoverflow.com/questions/2900370/why-does-ruby -1-9-2-remove-from-load-path-and-whats-the-alternative – knut

Trả lời

2
$LOAD_PATH << Dir.pwd 
require 'sql_parser' 

Theo ghi nhận của @AndrewGrimm, vì lý do bảo mật, bạn nên sử dụng này để thay thế:

thư mục của bạn có được trong đường dẫn tải hiện hành. Đường dẫn tải được lưu trữ trong một mảng toàn cầu có tên là $LOAD_PATH. Nếu bạn thêm thư mục hiện tại của bạn vào thư mục đó, thì bạn có thể sử dụng yêu cầu tải bất kỳ tệp nào trong thư mục.

Sử dụng Dir.pwd thay vì pwd .chomp theo đề nghị của các Tín Man

Ngoài ra tôi thích này trên require_relative trừ khi bạn có một dự án thực sự nhỏ khác điều có thể nhận xấu xí.

+0

Chúc mừng. Điều đó có hiệu quả, nhưng tôi nghĩ ruby ​​sẽ luôn nhìn vào pwd, tôi có sai không? –

+0

@Matt Roberts tiếc là không, nhưng nếu bạn đang làm việc trong một ứng dụng đường ray thì tất cả điều đó sẽ được xử lý cho bạn. – bkempner

+0

@ MattRoberts: Nó phụ thuộc vào phiên bản Ruby. – knut

3

Ngày 1.9, cú pháp được đổi thành require_relative, như các câu trả lời khác cho câu hỏi này.

Nếu bạn đang viết bằng Ruby 1.8, tôi khuyên bạn nên viết mã theo cách mong muốn và sử dụng require_relative gem, vì vậy bạn có thể sử dụng từ khóa này trong Ruby 1.8 và xử lý một điều chuyển tiếp ít hơn khi bạn chuyển sang 1.9

+0

Câu trả lời này phải là một nhận xét cho giải pháp chứ không phải là câu trả lời. –

7

Sử dụng

$:.unshift File.join(File.dirname(__FILE__)) 

để đảm bảo rằng bạn đang nhận được một con đường dựa trên nơi kịch bản có vị trí, chứ không phải là nơi mà các chương trình đang được thực hiện từ. Nếu không, bạn đang vứt bỏ lợi ích bảo mật có được bằng cách xóa "." khỏi đường dẫn tải.

(Có, tiêu đề của câu hỏi nói về yêu cầu tệp trong thư mục tập lệnh đang được chạy, nhưng phần thân của câu hỏi đề cập đến tệp được yêu cầu nằm trong cùng thư mục với tập lệnh được đề cập)

+0

Tại sao lại sử dụng "." kém an toàn? Ngoài ra, tại sao không Dir.pwd thay thế? (nó ngắn gọn hơn và hoàn thành cùng một điều không?) – bkempner

+0

@bkempner: Bạn đã đọc câu hỏi được liên kết trong phần bình luận của câu hỏi này chưa? –

+0

ah, tôi đã làm bây giờ, cảm ơn. – bkempner

3

cũng ...

yêu cầu "./myRubyFile" # thông báo chúng tôi loại trừ rb từ myRubyFile.rb

Các vấn đề liên quan