在gem中使用Pry而无需修改Gemfile或使用`require`

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

我在当地克隆了Gem以进行撬动(并且还允许我做一些好东西,比如git bisect等)

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

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

如果我不这样做,会出现LoadErrorcannot load such file -- pry (LoadError)

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

如何在没有Gemfiles干预的情况下在Rails中的Gem中使用binding.pry?

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

在这种情况下,您实际上描述了两个问题:(a)当Pry不在Gemfile中时,您不能require 'pry' pry’,(b)如果您不需要Pry,则不能使用Pry。

正如康拉德欧文所写的那样,Bundler所做的是:

Bundler是一个令人敬畏的gem,它给你一个很好的信心,“如果它在开发中工作,它在生产中工作”。 它可以通过对gem依赖关系恶毒来做到这一点:如果它不在Gemfile中,那么它就不是必需的。 它还确保每个人的开发环境都是相同的,“它在我的机器上运行”不再是一个借口。

在某些情况下,这种教条式的奉献精神可能会妨碍他们。 特别是所有优秀的开发人员都非常个人地建立了他们的开发环境 显然,我的本地工具在生产中工作并不重要,如果每个人都被迫拥有一个识别性的开发设置,那么这对生产力来说是非常不利的。

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

这意味着你不能在不污染Gemfile的情况下使用Pry,你说,对吧? 没那么快。 康拉德欧文是他聪明的小cookies,想出了一个解决方案并制作了Pry Debundle ,这个gem暂时颠覆了Bundler根据我们的要求制作的补丁。

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

猴子修复是将pry-debundle.rb的源代码硬拷贝到~/debundle.rb ,然后load它。 (现在,你需要Pry加载来运行那个源文件,但是你只能运行debundle!方法到达那里,需要Pry,然后去撬动。需要一点monkeypatching,但我正在努力PR)。

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

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

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

如果你正在将binding.pry更改推送到你的repo,你应该添加像Jim指出的提交钩子。 我不认为这是一个与撬相关的问题,它取决于你在推出它之前审查你的差异时需要多少谨慎。