2010-08-11 26 views
19

Có cách nào để "tải lại" hoặc "làm mới" một rubygem trong bộ nhớ không? Khi tôi đang chơi trong irb, đôi khi tôi muốn sửa đổi các tệp gem của mình, và nếu tôi yêu cầu cùng một gem, nó không cập nhật vào bộ nhớ và cho đầu ra "false". Hiện tại tôi phải thoát IRB, quay trở lại IRB và sau đó yêu cầu lại gem, phải có cách tốt hơn ... nó là gì?Nạp lại rubygem trong IRB

+0

nếu tôi viết mã chức năng này ở nơi nó nên đi? Rubygems? Cộng đồng đó có thường chấp nhận các yêu cầu kéo tính năng mới không? – Schneems

Trả lời

17

Như những người khác đã đề xuất, bạn có thể sử dụng tải hạt nhân #. . Tuy nhiên, đừng lãng phí thời gian của bạn tìm kiếm và tải mỗi tập tin đá quý như tất cả các file mà đã được yêu cầu được lưu trong $" Với thông tin này, đây là một tải lại IRB lệnh:

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| load(e) } 
end 

Ví dụ, nếu bạn đang sử dụng đá quý hirb trong IRB, bạn chỉ cần tải lại với:

>> reload 'hirb' 

Nếu vì bất cứ lý do tải không hoạt động (đó là pickier về phần mở rộng tập tin hơn yêu cầu là), bạn có thể tái yêu cầu bất kỳ tập tin bằng cách đầu tiên xóa mục nhập của nó bằng $ ". Với lời khuyên này, lệnh trên sẽ là:

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) } 
end 

Chọn tùy chọn nào phù hợp với bạn. Cá nhân, tôi sử dụng sau này.

+0

Điều này cũng có tác dụng đối với các tập lệnh được bao gồm trong hệ thống tệp không? Nó không làm việc cho tôi ... và câu lệnh require của tôi trông như thế này: 'require' # {File.expand_path (__ FILE __)} /../ lib/query "' – picardo

+2

Nó không, không. Regex quá hạn chế - bạn phải chỉ định đường dẫn đầy đủ. Tôi đã sửa đổi phiên bản của mình, thay thế^bằng /. – Trejkaz

8

tải 'filename.rb'

cùng một lúc cho mỗi đã được thay đổi ...

6

Một cách là sử dụng Kernel#load. Bạn có thể sử dụng nó khá giống như Kernel#require, ngoại trừ việc bạn phải bao gồm rõ ràng phần mở rộng của tệp. Tuy nhiên, nó có nhược điểm của nó (thậm chí một cái gì đó đơn giản như class Foo < Struct.new(:foo); end thất bại, vì nó không thể thay đổi siêu lớp của một lớp), vì vậy tôi cũng muốn biết một cách tốt hơn để làm điều này.

Trong đường ray bạn có thể đạt được điều này với reload! trên tập lệnh/bàn điều khiển, nhưng tôi không biết loại ma thuật nào họ sử dụng.

This gist có vẻ đầy hứa hẹn nhưng tôi chưa thử nghiệm.

+0

'tải lại!' Chỉ được tải các thứ trong thư mục 'app /', không có gì hơn. Cũng có những hạn chế đối với điều này, đó là lý do tại sao nhiều lớp và bộ điều khiển của bạn xuất hiện dưới dạng các lớp ẩn danh trong môi trường phát triển của bạn để chúng có thể được xử lý hoàn toàn và được khởi tạo lại theo từng yêu cầu. – tadman

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