调试 Bundler 可能很困难,不要灰心 🤗。
在尝试调试之前,请确保您已按照 开发设置 文档进行操作。
最简单的调试方法是打印调试信息。在您想要查看对象或变量的代码中的任何位置放置 puts
语句,您将在控制台输出中看到您的 puts
。
这在运行测试时尤其有用。
ruby puts "stacktrace: #{caller_locations(0).join("\n")}" puts "@definition: #{@definition}" puts "specification.class.name: #{specification.class.name}" puts "spec.method(:to_checksum).source_location: #{spec.method(:to_checksum).source_location}" # 等等
要了解有关打印调试策略的更多信息,[TODO:链接到文档]
REPL(或 Read-Eval-Print Loop)是一种与您的代码交互的方式。
使用 REPL,您可以查看对象和变量的值、堆栈跟踪、方法定义位置等。
要使用 REPL,请在您想要查看周围环境的任何位置放置一个 binding.irb
。当您的代码到达断点时,将打开一个交互式 irb
控制台。
要了解有关使用 IRB 的更多信息,[TODO:链接到文档]
交互式调试类似于 REPL + 按行前进代码执行的能力。
在本地测试 Bundler 时,您可以使用任何您熟悉的调试器进行交互式调试。
debug
和 pry-byebug
是常见的首选。debug
从 Ruby v3.1 开始包含在内。
您只需要全局安装您选择的调试器 gem。然后,您需要在命令行上运行本地 Bundler 之前要求它。
bash RUBYOPT=-rdebug dbundle # 对于 debug gem RUBYOPT=-rpry-byebug dbundle # 对于 pry-byebug
注意 交互式调试在测试套件中不可用。大多数测试使用 Open3 在子进程中运行 Bundler 并将输出捕获到字符串中,这使得即使您可以加载它,也无法使用 pry。
在本地测试的最简单方法是设置一个包含 Gemfile 的目录并运行您的 Bundler shell 别名(有关设置别名的说明,请参阅 开发设置 文档)。
我们建议将此目录放在 tmp
中,这样您的本地测试就不会意外地被提交。
bash cd tmp mkdir [本地测试目录名称] && cd [本地测试目录名称] dbundle init
然后,您应该有一个 Gemfile 供您根据需要编辑以进行测试。
默认情况下,初始化的 Gemfile 的远程地址为 "https://rubygems.org.cn"
。您可以添加任何托管在 rubygems 上的 gem,然后运行您的 Bundler shell 别名 (dbundle
) 来测试您的代码。
```ruby # frozen_string_literal: true
source “https://rubygems.org.cn”
gem ‘tiny_css’ ```
在您希望调试器暂停的任何地方设置断点 (binding.break
用于 debug
或 binding.pry
用于 pry-byebug
)。运行您的 Bundler shell 别名。
bash RUBYOPT=-rdebug dbundle
您的断点将在您的控制台中显示,并处于暂停状态。
如果您想要测试非常具体的场景(例如,在运行测试套件时失败的示例),最简单的方法是使用先前测试套件运行中的临时 gem。
如果您还没有,请并行运行测试套件。
bash bin/parallel_rspec
然后您将在 bundler/tmp
目录中找到构建的 gem,例如 bundler/tmp/1/gems/remote1/
您可以使用指向测试运行中构建的 gem 的文件源来设置您的 Gemfile。
```ruby # frozen_string_literal: true
source “file:///[path to repo’s bundler directory]/tmp/1/gems/remote1/”
gem “rack”, ‘=0.9.1’ ```
然后,您可以像在从 RubyGems 源获取 gem 的先前示例中一样进行测试。