Come puoi seguire l'intera sequenza & amp; l'ordine di "requisiti è in un'app Ruby come un albero?

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

Domanda

Come si può visualizzare la gerarchia di "requisiti che si svolgono in un'app Ruby?

Alcuni file richiedono file che richiedono file aggiuntivi.

Tuttavia, eseguendo un'applicazione in modalità debug si attiva solo un sottoinsieme di file richiesti, solo quelli che vengono utilizzati da qualsiasi sottoinsieme di funzionalità utilizzato dall'applicazione in un determinato momento.

Come è possibile visualizzare una gerarchia completa di tutti i requisiti in un'applicazione come albero?

È stato utile?

Soluzione

Il problema è che in modalità di sviluppo, tutti i file vengono caricati con load anziché richiedono in modo che possano essere ricaricati su ogni richiesta. In produzione vengono caricati una sola volta. Ad eccezione di alcune delle classi del framework, la maggior parte dei file viene caricata solo al primo utilizzo. Ciò accade perché ActiveSupport ignora const_missing per tentare automaticamente di caricare costanti sconosciute da file con lo schema di denominazione appropriato ( ConstantName.to_s.underscore darebbe richiedono 'constant_name' ). Questo ovviamente confonde davvero la gerarchia "richiedi".

Per un caso banale, puoi modificare quanto segue per soddisfare alcune delle tue esigenze (controlla anche le dipendenze in 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

Buona fortuna

EDIT: spiegazione

Ciò che fa è creare un array globale per archiviare il livello di nidificazione dei requisiti. Il primo mette in output il file richiesto. Quindi viene aggiunto un trattino al livello di annidamento. Il file è quindi effettivamente richiesto. Se le chiamate al file caricato richiedono, quindi l'intero processo ricomincia, tranne per il fatto che il livello di annidamento è 1 profondo, quindi " - # {file} " è messo. Questo processo si ripete tranne quando il livello di annidamento aumenta, così come i trattini. Dopo che un file e tutte le sue dipendenze sono state caricate, request toglie il trattino aggiunto in modo che il livello di annidamento sia nello stesso stato in cui si trovava all'avvio della richiesta. Ciò mantiene accurata la struttura ad albero.

const_missing è simile a method_missing. Fondamentalmente, proprio come quando chiami AnObject.some_unknown_method ruby ??chiamerà AnObject.method_missing (: some_unknown_method) prima di sollevare un NoMethodError, usando SomeUnknownConstant attiva un const_missing (: SomeUnknownConstant ) prima di generare un NameError. Rails definisce const_missing in modo tale che cercherà determinati percorsi specificati per i file che potrebbero definire la costante mancante. Utilizza una convenzione di denominazione per facilitare ciò, ad es. SomeUnknownConstant dovrebbe trovarsi in some_unknown_constant.rb

Esiste un metodo per gran parte di questa follia di binari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top