【问题标题】:Ruby on Rails: debugging rake tasksRuby on Rails:调试 rake 任务
【发布时间】:2011-02-09 11:19:19
【问题描述】:

当我写 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

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

【问题讨论】:

标签: ruby-on-rails ruby debugging rake ruby-debug


【解决方案1】:

我找到了解决办法。

$ gem install ruby-debug
$ ruby-debug rake my:task

或在某些系统上

$ rdebug rake my:task

【讨论】:

  • 确实,尽管您不应该在 rake 任务中执行大量逻辑。我的大部分 rake 任务都是单行代码,它调用模型上的方法,然后完全覆盖测试。
  • 我正在做基于机械化的蜘蛛,我需要调试一些行。所有这些都在方法中,还没有被测试覆盖。谢谢你的回复。
  • @rspeicher,如果你有种子任务,这很有用
  • 在我的系统上是rdebug 而不是ruby-debug
  • 提示:在开头添加 Debugger.settings[:autoeval] = true,这将导致典型的 rails 行为,您键入的所有内容都运行在 self 范围内,您在其中放置了 debugger 调用。
【解决方案2】:

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 'debugger' 放在顶部,而是放入内联require 'debugger'; debugger。这样,当您删除debugger 语句时,您就不会忘记删除require
【解决方案3】:

我强烈推荐pry

bundle install pry
require 'pry'
rake ...

在您的 rake 任务 文件中:

binding.pry 

【讨论】:

    【解决方案4】:

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

    require 'ruby-debug'
    # ... code ...
    debugger
    

    【讨论】:

      【解决方案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"]
      }
      

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

      【讨论】:

      • all 对我不起作用。我使用了rvms rake 并将args 设置为我的任务的名称,并在它的第一行设置了一个断点,它对我有用。
      • @SomeGuyOnAComputer:因此句子“这将运行所有 rake 任务”。这只是我(/两年前)的一项任务的名称。
      • 很糟糕,我错过了
      【解决方案6】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 2015-03-10
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多