it-swarm-pt.tech

Melhor maneira de depurar joias de terceiros em ruby

Uma vez que pode haver muitos Métodos Fantasma dentro de uma Ruby gem, não acho que seja uma boa ideia estudar o mecanismo interno de uma Ruby gem apenas lendo seu código-fonte estaticamente. Existe uma maneira de anexar o arquivo-fonte de uma gem de terceira parte a um Ruby processo de depuração para que eu pode definir o ponto de interrupção e ver como as coisas funcionam dinamicamente?
BTW, eu tentei navegar para o arquivo de origem de uma gema de terceira parte no RubyMine clicando no menu de contexto "Go To-> Implementations" da instrução 'require' ou outro símbolo de uma terceira -part gem (require 'watir' por exemplo), sem sucesso. É normal que um IDE de uma linguagem de digitação dinâmica como Ruby falhe em uma navegação de símbolo)?

35
TomCaps

Adoraria saber se existe uma maneira melhor de fazer isso, mas como costumo fazer isso é:

  1. Adicione a gem Ruby-debug ao seu Gemfile (ou Ruby-debug19 se você estiver em Ruby 1.9.2)
  2. Encontre a joia fazendo bundle show gemname. Estou em um Mac, então geralmente canalizo isso para pbcopy para que seja copiado para minha área de transferência. bundle show Rails | pbcopy
  3. Abra o diretório gem em seu editor favorito. mvim /path/to/gem/directory
  4. Navegue até o arquivo e a linha onde deseja colocar o ponto de interrupção * e insira debugger acima da linha em questão.
  5. Recarregue a página, execute o teste ou faça o que quiser para que o arquivo Gem seja executado
  6. Quando a execução para no depurador, você pode inspecionar as variáveis ​​(p variable_name) e mova linha por linha com comandos do depurador Ruby .

* Saber onde colocar o ponto de interrupção pode exigir algum entendimento do código, mas você deve começar em lib/gemname.rb

47
Peter Brown

Eu evitaria editar os arquivos Gem, conforme sugerido na resposta atualmente aceita. Em vez disso, coloque o comando debugger em um dos arquivos do seu aplicativo e use o comando break para definir um ponto de interrupção no gem. Estou usando rvm com gemset então aqui está como eu faço isso:

break /Users/chris/.rvm/gems/[email protected]<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

14
Chris Beck

Ambos os comandos geram um caminho para a origem da gema em seu computador.

# if it is present in your gemfile
bundle show gemname

# if not in your gemfile
gem which gemname

Depois é só abrir a pasta no editor de texto de sua preferência e boa depuração!

1
Flavio Wuensche

pry gem funciona para mim.

bundle add pry --group "development, test"

E você deve exigir o pry em arquivos .rb onde você está usando binding.pry

require 'pry'

Aqui está o link do GitHub

0
Chimed Palden

Em linguagens que mudam o código em tempo de execução, como Ruby, é difícil prever com precisão 100% as origens dos símbolos, métodos etc.

Eu lido com muitas joias de terceiros que precisam de análise de código-fonte e descobri que a melhor ferramenta para essa tarefa é Netbeans + its Ruby e Rails = plugin .

  • permite uma boa navegação no código-fonte das gemas dependentes (ao contrário de outras alternativas)
  • pontos de interrupção visuais e depuração que realmente funcionam (com rastreamento e tudo) **

** tem algumas falhas com chamadas de método em blocos de código produzidos (como each {}) mas aprendi a lidar com isso.

O que geralmente faço é definir pontos de interrupção e analisar o código em tempo de execução.

0
clyfe