Como você pode acompanhar a sequência completa e ordem de 'necessitam de em um aplicativo Ruby como uma árvore?

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

Pergunta

Como você pode exibir a hierarquia de 'exigem do que ocorrem em um aplicativo Ruby?

Alguns arquivos requerem arquivos que requerem arquivos adicionais.

No entanto, ao executar um aplicativo no modo de depuração só desencadear um subconjunto de arquivos necessários -. Apenas os que são usados ??por qualquer subconjunto de funcionalidades seu aplicativo está usando a qualquer ponto no tempo

Como você poderia exibir uma hierarquia completa de todo o exige em um aplicativo como uma árvore?

Foi útil?

Solução

O problema é que no modo de desenvolvimento, todos os arquivos são carregados com load em vez de require para que elas possam ser recarregadas a cada solicitação. Na produção que são carregados apenas uma vez. Com exceção de algumas das classes do framework, a maioria dos arquivos ainda são apenas carregado quando eles são usados ??em primeiro lugar. Isso acontece porque as substituições ActiveSupport const_missing para tentar automaticamente para carregar constantes desconhecidas a partir de arquivos com o esquema de nomenclatura adequada (ConstantName.to_s.underscore daria require 'constant_name'). Isto, obviamente, realmente confusões até a hierarquia 'exigem'.

Para um caso trivial, você pode modificar o seguinte para satisfazer algumas das suas necessidades (também verificar dependências em 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

Boa sorte

EDIT: Explicação

O que isso faz é criar uma matriz global para armazenar o nível de aninhamento de requer. O primeiro coloca gera o arquivo necessário. Em seguida, um traço é adicionado ao nível de aninhamento. O arquivo é então realmente necessário. Se as chamadas arquivo carregado exigem, então todo este processo começa de novo, a não ser que o nível de aninhamento é uma profunda assim "- # {file}" é coloca-ed. Esse processo se repete, exceto conforme o nível de aninhamento cresce, assim como os traços. Depois de um arquivo e todas as suas dependências são carregados, exigem tira o traço que adicionado para que nível de aninhamento é no mesmo estado em que estava quando o requerem começou. Isso mantém a estrutura da árvore preciso.

const_missing é semelhante ao method_missing. Basicamente, assim como quando você chamar AnObject.some_unknown_method rubi chamará AnObject.method_missing(:some_unknown_method) antes de levantar um NoMethodError, usando disparadores SomeUnknownConstant um const_missing(:SomeUnknownConstant) antes de levantar um NameError. Rails define const_missing de tal forma que ele irá procurar certos caminhos específicos para arquivos que podem definir a constante falta. Ele usa uma convenção de nomenclatura para facilitar este processo, por exemplo SomeUnknownConstant é esperado para estar em some_unknown_constant.rb

Há um método para grande parte desta trilhos loucura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top