2009-06-18 11 views
5

Làm cách nào bạn có thể hiển thị cấu trúc phân cấp của 'yêu cầu diễn ra trong ứng dụng Ruby?Làm thế nào bạn có thể theo dõi chuỗi và thứ tự đầy đủ của 'require's trong ứng dụng Ruby dưới dạng cây?

Một số tệp yêu cầu tệp yêu cầu tệp bổ sung.

Tuy nhiên, bằng cách chạy một ứng dụng trong chế độ gỡ lỗi, bạn chỉ kích hoạt một tập con các tệp được yêu cầu - chỉ những tệp được sử dụng bởi bất kỳ tập con nào của ứng dụng mà bạn đang sử dụng tại bất kỳ thời điểm nào.

Làm cách nào bạn có thể hiển thị một hệ thống phân cấp toàn diện của tất cả các yêu cầu trong ứng dụng dưới dạng cây?

Trả lời

9

Vấn đề ở chế độ phát triển, tất cả các tệp được tải bằng load thay vì require để chúng có thể được tải lại theo từng yêu cầu. Trong quá trình sản xuất, chúng chỉ được nạp một lần. Ngoại trừ một số lớp khung, hầu hết các tệp vẫn chỉ được tải khi chúng được sử dụng lần đầu tiên. Điều này xảy ra vì ActiveSupport ghi đè const_missing để tự động cố gắng tải các hằng số không xác định từ các tệp có lược đồ đặt tên thích hợp (ConstantName.to_s.underscore sẽ cung cấp cho require 'constant_name'). Điều này tất nhiên thực sự muddles lên 'yêu cầu' hệ thống phân cấp.

Đối với một trường hợp tầm thường, bạn có thể thay đổi sau đây để đáp ứng một số nhu cầu của bạn (cũng kiểm tra phụ thuộc vào active_support)

$require_level = [] 
    alias :orig_require :require 
    def require(file) 
    puts "#{$require_level.join}#{file}" 
    $require_level << "-" 
    r = orig_require(file) 
    $require_level.pop 
    r 
    end 

    require 'foo' 
    require 'baz' 


[email protected]:~ $ ruby check_requires.rb 
foo 
-bar 
baz 

Chúc may mắn

EDIT: Giải thích

gì đó không tạo ra một mảng toàn cầu để lưu trữ mức độ làm tổ của yêu cầu. Các đầu tiên đặt đầu ra các tập tin cần thiết. Sau đó, một dấu gạch ngang được thêm vào mức lồng nhau. Các tập tin sau đó là thực sự cần thiết. Nếu các cuộc gọi tập tin được tải yêu cầu, thì toàn bộ quá trình này bắt đầu lại, ngoại trừ mức làm tổ đó là 1 sâu nên "- # {file}" là cài đặt. Quá trình này lặp lại ngoại trừ khi mức lồng nhau phát triển, do đó, làm các dấu gạch ngang. Sau khi một tập tin và tất cả các phụ thuộc của nó được nạp, yêu cầu phải tắt dấu gạch ngang mà nó được thêm vào để mức lồng nhau ở cùng trạng thái khi yêu cầu bắt đầu. Điều này giữ cho cấu trúc cây chính xác.

const_missing tương tự như method_missing. Về cơ bản, giống như khi bạn gọi AnObject.some_unknown_method ruby ​​sẽ gọi AnObject.method_missing(:some_unknown_method) trước khi tăng NoMethodError, sử dụng SomeUnknownConstant kích hoạt một const_missing(:SomeUnknownConstant) trước khi tăng một NameError. Rails định nghĩa const_missing sao cho nó sẽ tìm kiếm một số đường dẫn cụ thể cho các tệp có thể xác định hằng số còn thiếu. Nó sử dụng quy ước đặt tên để tạo điều kiện thuận lợi cho điều này, ví dụ: SomeUnknownConstant dự kiến ​​sẽ ở trong some_unknown_constant.rb

Có một phương pháp để phần lớn sự điên rồ của đường ray này.

+0

Wow. Đó là một kịch bản nhỏ đẹp. Hãy để tôi xem nếu tôi có thể tìm ra những gì bạn đang làm. Vì vậy, require_level là một mảng toàn cục trống. Sau đó, bạn bí danh phương thức require là orig_require và xác định lại yêu cầu. Không chắc chắn câu lệnh đặt đầu tiên của bạn là gì. Sau đó, bạn thêm một dấu gạch ngang vào mảng. Sau đó, bạn yêu cầu các tập tin, pop giá trị cuối cùng từ mảng (tại sao bận tâm? Nó chỉ là một dấu gạch ngang, phải không? Bạn chỉ cần in "-"?) Sau đó, bạn in tên của tập tin mà bạn yêu cầu. Dường như nó hoạt động, tôi không chắc nó hoạt động như thế nào. Cảm ơn kịch bản. Tôi sẽ thử điều này ngay bây giờ. – monkeyman

+0

Ngoài ra, trong câu trả lời của bạn, tôi không hiểu ý của bạn về const_missing. Bạn có phiền về việc đó không? – monkeyman

+0

Cảm ơn - kịch bản của bạn hoạt động tuyệt vời! – monkeyman