13

我正在尝试调试 Rails 应用程序使用的 gem。

我在本地克隆了 Gem 以四处窥探(还允许我做一些好事,例如git bisect,等等)

# Gemfile
gem "active_admin", path: "~/dev-forks/active_admin"

但是,我经常坚持将 Pry 添加到 Gemfile 某个地方以便能够使用它,或者require "pry"在代码中实时调用,即使我不希望它在那里。例如,我有时会忘记它,修复错误,然后使用 Gemfile 中的 Pry 提交到项目。

如果我不这样做,一个LoadError意志就会出现,cannot load such file -- pry (LoadError)

我必须管理我在不同的上下文(Rails 项目、Gem、本地 Ruby)和实际的 gem(Gemfile、require、installed)之间有点迷失。

我如何binding.pry在 Rails 中的 Gem 中使用,而无需 Gemfiles 的干预?

4

2 回答 2

9

过去的乔恩!如你所知,我有(几乎)你所有问题的答案。

在这种情况下,您实际上是在描述两个问题:(a)require 'pry'当 Pry 不在 Gemfile 中时您不能使用,(b)如果您不使用 Pry,您将无法使用require

正如 Conrad Irwin所写,Bundler 做了什么:

Bundler 是一个很棒的宝石,它让你有很大的信心“如果它在开发中工作,它在生产中工作”。它可以通过对 gem 依赖项恶毒来做到这一点:如果它不在 Gemfile 中,则不需要它。它还确保每个人的开发环境都是相同的,不再以“它可以在我的机器上运行”为借口。

在某些情况下,这种对职责的教条式奉献可能会成为阻碍。特别是所有优秀的开发人员都非常个人地设置了他们的开发环境。显然,我的本地工具在生产中工作并不重要,如果每个人都被迫拥有相同的开发设置,这对生产力是不利的。

因此,在 Bundler 为我们 Ruby 开发人员所做的所有好事时,它的设计带有一个警告:“bundle/Gemfile 之外的东西(例如系统 gem)不再存在。” 它是如何做到这一点的,方法是重新定义require流程并更改您的流程,PATH以便它只看到捆绑包中的内容。

这意味着你根本不能使用 Pry 而不污染 Gemfile,你说,对吗?没那么快。Conrad Irwin 是一个聪明的小饼干,他想出了一个解决方案并制作了Pry Debundle,这是一个可以暂时反转 Bundler 根据我们的要求制作的补丁的宝石。

所以你所要做的就是require 'pry-debundle'那时,对吧?等一下。是的,Debundle 可能不在 Gemfile 中。

猴子修复是硬拷贝 to 的源代码pry-debundle.rb~/debundle.rb然后load是那个。(现在,您需要加载 Pry 才能运行该源文件,但您只能运行debundle!到达那里的方法,需要 Pry 并四处窥探。需要一点猴子补丁,但我正在做 PR。 )

于 2016-01-02T19:13:23.977 回答
2

如果您想在 Rails 应用程序中使用和调试 gem,那么它应该在应用程序中 Gemfile 的开发和测试组中。

您可以使用 pry-debugger https://github.com/nixme/pry-debugger等工具在您的 pry session 中设置断点break SomeClass#run

我认为在我 fork 的每个项目中添加 pry 以修复错误或贡献内容是有效的。只是不要把它放在.gemspec文件中。

如果您将binding.pry更改推送到您的存储库,您应该像 Jim 指出的那样添加提交挂钩。我不认为这是一个与撬动相关的问题,它取决于您在推出差异之前审查差异时的注意程度。

于 2013-08-07T20:31:56.077 回答