Ruby 앱에서 'require'의 전체 시퀀스와 순서를 트리로 어떻게 추적할 수 있나요?

StackOverflow https://stackoverflow.com/questions/1013507

문제

Ruby 앱에서 발생하는 'require' 계층 구조를 어떻게 표시할 수 있나요?

일부 파일에는 추가 파일이 필요한 파일이 필요합니다.

그러나 디버그 모드에서 응용 프로그램을 실행하면 필요한 파일의 하위 집합만 트리거됩니다. 즉, 특정 시점에 응용 프로그램이 사용하는 기능의 하위 집합에서 사용되는 파일만 트리거됩니다.

애플리케이션의 모든 요구 사항에 대한 포괄적인 계층 구조를 트리로 어떻게 표시할 수 있습니까?

도움이 되었습니까?

해결책

문제는 개발 모드에서 모든 파일이 다음과 같이 로드된다는 것입니다. load 오히려 require 각 요청마다 다시 로드될 수 있도록 합니다.프로덕션에서는 한 번만 로드됩니다.일부 프레임워크 클래스를 제외하고 대부분의 파일은 처음 사용될 때만 로드됩니다.이는 ActiveSupport가 const_missing을 재정의하여 적절한 명명 체계를 사용하는 파일에서 알 수 없는 상수를 자동으로 로드하려고 시도하기 때문에 발생합니다(ConstantName.to_s.underscore 줄 것이다 require 'constant_name').물론 이것은 '필수' 계층 구조를 실제로 혼란스럽게 만듭니다.

사소한 경우에는 일부 요구 사항을 충족하도록 다음을 수정할 수 있습니다(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'


 ben@legba-2:~ $ ruby check_requires.rb 
 foo
 -bar
 baz

행운을 빌어요

편집하다:설명

이는 요구 사항의 중첩 수준을 저장하기 위한 전역 배열을 만드는 것입니다.첫 번째 put은 필요한 파일을 출력합니다.그런 다음 중첩 수준에 대시가 추가됩니다.그런 다음 파일이 실제로 필요합니다.로드된 파일 호출에 필요한 경우 중첩 수준이 1이므로 "-#{file}"이 puts된다는 점을 제외하고 이 전체 프로세스가 다시 시작됩니다.중첩 수준이 커지는 것을 제외하고는 이 프로세스가 반복되므로 대시도 마찬가지입니다.파일과 모든 종속 항목이 로드된 후 require는 추가한 대시를 제거하여 중첩 수준이 require가 시작되었을 때와 동일한 상태가 되도록 합니다.이렇게 하면 트리 구조가 정확하게 유지됩니다.

const_missing은 method_missing과 유사합니다.기본적으로는 전화할 때와 마찬가지로 AnObject.some_unknown_method 루비가 전화할 거야 AnObject.method_missing(:some_unknown_method) NoMethodError가 발생하기 전에 SomeUnknownConstant를 사용하면 const_missing(:SomeUnknownConstant) NameError를 일으키기 전에.Rails는 누락된 상수를 정의할 수 있는 파일에 대해 지정된 특정 경로를 검색하도록 const_missing을 정의합니다.이를 용이하게 하기 위해 명명 규칙을 사용합니다. SomeUnknownConstant 에 있을 것으로 예상된다 some_unknown_constant.rb

이 레일 광기에는 많은 방법이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top