Ruby on Rails:调试rake任务

And*_*sov 41 ruby debugging rake ruby-on-rails ruby-debug

当我写debugger它不开始:

NoMethodError: undefined method `run_init_script' for Debugger:Module
from /usr/local/lib/ruby/gems/1.8/gems/ruby-debug-base-0.10.3/lib/ruby-debug-base.rb:239:in `debugger'
from (irb):4
Run Code Online (Sandbox Code Playgroud)

如果我跑rake my:task --debugger,它会立即将我返回到控制台.如何调试rake任务?

And*_*sov 40

我找到了解决方案.

$ gem install ruby-debug
$ ruby-debug rake my:task
Run Code Online (Sandbox Code Playgroud)

或者在某些系统上

$ rdebug rake my:task
Run Code Online (Sandbox Code Playgroud)

  • 在我的系统上是`rdebug`而不是`ruby-debug` (11认同)
  • 实际上,你不应该在rake任务中做大量的逻辑.我的大多数rake任务都是单行调用模型上的方法,然后完全覆盖测试. (2认同)

Lir*_*dav 26

Andrey Kouznetsov的回答对我使用Ruby 1.9.3不起作用.ruby-debug gem似乎不支持Ruby 1.9.我不得不使用调试器gem:https://github.com/cldwalker/debugger.

  1. 添加gem 'debugger'到我的Gemfile开发组.
  2. bundle.
  3. 添加require 'debugger'到我的rake任务的顶部.
  4. debugger在我的rake任务中添加一个我想要断点的地方.
  5. 通常从命令行运行rake任务,例如:rake my:task.

  • 另一种选择,而不是在顶部放置`require'调试器',就是把内联`require'调试器'; debugger`.这样,当你删除`debugger`语句时,你不会忘记删除`require`. (2认同)

Abr*_*ram 9

我强烈推荐这个

bundle install pry
require 'pry'
rake ...
Run Code Online (Sandbox Code Playgroud)

在你的rake任务文件中:

binding.pry 
Run Code Online (Sandbox Code Playgroud)


Sea*_*ary 6

这种方法对我不起作用.我刚刚在我的代码中添加了这个:

require 'ruby-debug'
# ... code ...
debugger
Run Code Online (Sandbox Code Playgroud)


Mat*_*tW. 5

Visual Studio Code具有非常好的内置调试器。如果有人发现这个正在寻找一种让它与 rake 一起工作的方法,这里有一个有效的配置:

{
    "name": "Debug a rake task",
    "type": "Ruby",
    "request": "launch",
    "useBundler": true,
    "cwd": "${workspaceRoot}",
    "program": "/usr/local/bin/rake",
    "args": ["all"]
}
Run Code Online (Sandbox Code Playgroud)

这将运行 rake 任务all。您可能必须更改 rake 的路径,我没有找到在 PATH 中运行该路径的方法。