Comment pouvez-vous suivre la séquence complète & amp; ordre de 'besoin est dans une application Ruby comme un arbre?
-
06-07-2019 - |
Question
Comment pouvez-vous afficher la hiérarchie des "Requis" qui ont lieu dans une application Ruby?
Certains fichiers nécessitent des fichiers qui nécessitent des fichiers supplémentaires.
Cependant, en exécutant une application en mode débogage, vous ne déclenchez qu'un sous-ensemble de fichiers obligatoires, uniquement ceux utilisés par le sous-ensemble de fonctionnalités que votre application utilise à un moment donné.
Comment pouvez-vous afficher une arborescence complète de toutes les exigences dans une application sous forme d'arborescence?
La solution
Le problème est qu'en mode de développement, tous les fichiers sont chargés avec load
plutôt que require
afin de pouvoir être rechargés à chaque demande. En production, ils ne sont chargés qu'une fois. À l'exception de certaines classes de la structure, la plupart des fichiers ne sont encore chargés que lorsqu'ils sont utilisés pour la première fois. Cela est dû au fait qu'ActiveSupport substitue const_missing pour tenter automatiquement de charger des constantes inconnues à partir de fichiers avec le schéma de nommage approprié ( ConstantName.to_s.underscore
donnerait à require 'nom_contant'
). Bien entendu, cela brouille vraiment la hiérarchie des "exigences".
Pour un cas trivial, vous pouvez modifier les éléments suivants pour répondre à certains de vos besoins (consultez également les dépendances dans actif_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
Bonne chance
EDIT: Explication
Cela crée un tableau global pour stocker le niveau d’imbrication requis. Le premier met en sortie le fichier requis. Ensuite, un tiret est ajouté au niveau d'imbrication. Le fichier est alors réellement requis. Si les appels de fichier chargés le nécessitent, alors tout le processus recommence, sauf que le niveau d’emboîtement est égal à 1, donc "- # {fichier}". est put-ed. Ce processus se répète sauf lorsque le niveau d'imbrication augmente, les tirets également. Après le chargement d'un fichier et de toutes ses dépendances, require supprime le tiret ajouté, de sorte que le niveau d'imbrication est dans le même état que lors du démarrage de l'exigence. Cela permet de conserver la structure de l'arborescence.
const_missing est similaire à method_missing. Tout comme lorsque vous appelez AnObject.some_unknown_method
, ruby ??appellera AnObject.method_missing (: some_unknown_method)
avant de générer une erreur NoMethodError, l'utilisation de SomeUnknownConstant déclenchera un const_missing (: SomeUnknownConstant )
avant de générer une erreur NameError. Rails définit const_missing de manière à rechercher dans certains chemins spécifiés les fichiers susceptibles de définir la constante manquante. Il utilise une convention de dénomination pour faciliter cela, par ex. SomeUnknownConstant
devrait figurer dans some_unknown_constant.rb
Il existe une méthode pour beaucoup de cette folie des rails.