Comment pouvez-vous suivre la séquence complète & amp; ordre de 'besoin est dans une application Ruby comme un arbre?

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

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top