¿Cómo puedes seguir la secuencia completa & amp; orden de 'require' en una aplicación Ruby como árbol?

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

Pregunta

¿Cómo puede mostrar la jerarquía de 'requisitos' que tienen lugar en una aplicación Ruby?

Algunos archivos requieren archivos que requieren archivos adicionales.

Sin embargo, al ejecutar una aplicación en modo de depuración solo se activa un subconjunto de archivos requeridos, solo aquellos que son utilizados por cualquier subconjunto de funcionalidad que su aplicación esté utilizando en un momento dado.

¿Cómo podría mostrar una jerarquía integral de todos los requisitos en una aplicación como un árbol?

¿Fue útil?

Solución

El problema es que en el modo de desarrollo, todos los archivos se cargan con load en lugar de require para que se puedan volver a cargar en cada solicitud. En producción se cargan solo una vez. Con la excepción de algunas de las clases de framework, la mayoría de los archivos solo se cargan cuando se usan por primera vez. Esto sucede porque ActiveSupport anula const_missing para intentar cargar automáticamente constantes desconocidas de los archivos con el esquema de nomenclatura apropiado ( ConstantName.to_s.underscore daría require 'constant_name' ). Por supuesto, esto realmente confunde la jerarquía de "requerir".

Para un caso trivial, puede modificar lo siguiente para satisfacer algunas de sus necesidades (también verifique las dependencias en 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

Buena suerte

EDITAR: Explicación

Lo que hace es crear una matriz global para almacenar el nivel de anidamiento de los requisitos. El primero pone salidas al archivo requerido. Luego se agrega un guión al nivel de anidación. El archivo se requiere realmente. Si las llamadas al archivo cargado requieren, entonces todo este proceso comienza de nuevo, excepto que el nivel de anidación es 1 profundo, por lo que " - # {file} " es put-ed. Este proceso se repite, excepto a medida que crece el nivel de anidación, también lo hacen los guiones. Después de cargar un archivo y todas sus dependencias, require quita el guión que agregó para que el nivel de anidamiento esté en el mismo estado que tenía cuando comenzó el require. Esto mantiene la estructura de árbol precisa.

const_missing es similar a method_missing. Básicamente, al igual que cuando llama a AnObject.some_unknown_method , ruby ??llamará a AnObject.method_missing (: some_unknown_method) antes de generar un NoMethodError, utilizando SomeUnknownConstant desencadena un const_missing (: SomeUnknownConstant ) antes de generar un NameError. Rails define const_missing de modo que buscará en ciertas rutas especificadas archivos que puedan definir la constante que falta. Utiliza una convención de nomenclatura para facilitar esto, p. Se espera que SomeUnknownConstant esté en some_unknown_constant.rb

Hay un método para gran parte de esta locura de rieles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top