Wie können Sie die vollständige Sequenz und Reihenfolge von ‚als ein Baum in einem Ruby-App benötigt die Spur?

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

Frage

Wie können Sie die Hierarchie der ‚Anzeige des erfordern, die in einem Ruby-App nehmen?

Einige Dateien Dateien benötigen, die zusätzliche Dateien benötigen.

Doch durch eine Anwendung im Debug-Modus lösen Sie nur einen Teil der benötigten Dateien -. Nur diejenigen, die durch was auch immer Teilmenge der Funktionalität verwendet werden, Ihre Anwendung zu einem bestimmten Zeitpunkt mit

Wie Sie eine umfassende Hierarchie aller das erfordert in einer Anwendung als Baum angezeigt werden kann?

War es hilfreich?

Lösung

Das Problem ist, dass im Entwicklungsmodus, werden alle Dateien mit load geladen werden, anstatt require, so dass sie bei jeder Anfrage neu geladen werden kann. In der Produktion werden sie nur einmal geladen. Mit Ausnahme von einigen der Framework-Klassen sind die meisten Dateien nach wie vor nur geladen werden, wenn sie zum ersten Mal verwendet werden. Dies geschieht, weil Activeüberschreibt const_missing automatisch unbekannte Konstanten aus Dateien mit dem entsprechenden Namensschema zu laden, um zu versuchen (ConstantName.to_s.underscore würde require 'constant_name'). Dies natürlich trübt bis wirklich die Hierarchie ‚require‘.

Für einen trivialen Fall können Sie ändern die folgend einige Ihre Bedürfnisse zu erfüllen (auch Abhängigkeiten in active_support check out)

  $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

Viel Glück

EDIT: Erläuterung

Was das tut, ist ein globales Array erstellen, die Verschachtelungsebene zu speichern, erfordert. Der erste puts gibt die gewünschte Datei. Dann wird ein Strich auf der Verschachtelungsebene hinzugefügt. Die Datei wird dann tatsächlich benötigt wird. Wenn die geladene Datei Anrufe benötigen, dann ist dieser ganze Prozess beginnt wieder, mit der Ausnahme, dass Verschachtelungsebene 1 tief, so „- # {file}“ puts-ed ist. Dieser Vorgang wiederholt sich mit Ausnahme der Verschachtelungsebene wächst, so die Bindestriche tun. Nachdem eine Datei und alle seine Abhängigkeiten geladen werden, dauert benötigen einen Bindestrich, dass sie hinzugefügt aus, so dass Verschachtelungsebene im gleichen Zustand ist es, wenn der Autor erfordern. Dies hält die Baumstruktur genau.

const_missing ist ähnlich method_missing. Im Grunde genommen genauso, wie wenn Sie AnObject.some_unknown_method Rubin nennen AnObject.method_missing(:some_unknown_method) nennen, bevor Sie eine NoMethodError Anheben mit SomeUnknownConstant eine const_missing(:SomeUnknownConstant) auslöst, bevor Sie eine Nameerror erhöhen. Rails definiert const_missing, so dass sie bestimmte festgelegte Pfade für Dateien suchen, die die fehlenden Konstante definieren könnte. Es verwendet eine Namenskonvention dies zu erleichtern, z.B. SomeUnknownConstant wird erwartet, dass in some_unknown_constant.rb sein

Es ist eine Methode, um viel von diesen Schienen Wahnsinn.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top