Come puoi seguire l'intera sequenza & amp; l'ordine di "requisiti è in un'app Ruby come un albero?
-
06-07-2019 - |
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?
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.