如何在开发 Ruby Gem 时添加 "pry"?

7
我有一个名为“something”的宝石。
我想在开发这个宝石时将pry添加为开发依赖项。但是我不知道如何加载它。
如果我在lib/something.rb中使用"require something",当我发布宝石时,会抛出LoadError,因为pry只是一个开发依赖项。
与此同时,我不想在提交代码时不断添加和删除pry。
最好的方法是什么?只在开发应用程序时需要pry,而不将其作为宝石的依赖项要求?

类似的问题,但没有答案:https://dev59.com/KWMl5IYBdhLWcg3wzprV?rq=1 - Anton Evangelatov
1
也许需要考虑执行需要 pry 的代码的上下文。如果是从规范中执行,则将 require 放在 spec_helper.rb(或等效文件)中。如果是从 rake 任务中执行,则将其放在 Rakefile 中。如果是从原始脚本中执行,则将 require 放在那里,或者使用 ruby -rpry 从命令行参数加载它。 - Abe Voelker
2个回答

3
你可以在gemspec文件中使用add_development_dependency。但你仍需要在lib/something.rb文件中使用begin .. rescue LoadError块进行require。(编辑2,见下文)
在你的情况下,代码如下:
spec.add_development_dependency 'pry', '~> 0.9.12.2'
add_development_dependency 的目的是将 gem 区分为在执行 gem install mygem 时安装的依赖项和仅在执行 gem install mygem --development 时安装的开发依赖项。

编辑:@Pierre-Louis Gottfrois 的解决方案

直接修改 Gemfile 并添加一个 test 组。 此问题 描述了该过程。根据 Yehuda Katz 的说法,这似乎不是首选解决方案。

编辑 2:根据此 Making Ruby Gems 文章,begin require ... rescue LoadError 显然是 Ruby 脚本的常见做法。


1
这个方案完美运行,是正确的选择,但它在测试环境下不起作用。你需要将 gem 直接添加到 Gemfile 中的 test 组中。 - Pierre-Louis Gottfrois
然而,当我将宝石发布到生产环境时,lib/something.rb中仍然有"require pry",但是"pry"现在已经丢失,因为它是开发依赖项。在发布之前,如果我理解正确的话,我应该删除"require pry"...这正是我想要避免的。 - Anton Evangelatov
@antonevangelatov 或许可以在 begin .. rescue LoadError 块中尝试使用条件 require?类似于这个问题中的做法。 - user2062950
@user2062950,那肯定是可行的,但感觉像是一种hack。我想知道是否有一种“正确”的方法来做,即仅在开发阶段加载某些宝石(pry、debugger等),而无需在部署/发布之前费心地包含/排除它们。我不明白添加add_development_dependency的目的是什么,因为您必须稍后添加一个“require”,并确保删除它,因为未加载所需宝石。如果您需要手动每次添加“require”,那么您可能也可以手动将必要的宝石添加到gemspec或Gemfile中。 - Anton Evangelatov
@antonevangelatov 添加了更多信息。 - user2062950
@user2062950 感谢你的详细回答。显然,没有更好的解决方案了,我会将其标记为正确答案。我知道 add_development_dependency 只会在开发模式下安装所需的 gem,但我仍然对“require”/load 它们的最佳实践存在疑问...以 "rspec" 为例,很明显——只有在 "spec_helper" 中需要它,因此不会干扰应用程序的其他部分。 在开发时只运行 rspec (spec_helper.rb) ... 但同样的情况对于 "pry" 不适用,因为我需要在整个应用程序开发过程中使用它。 - Anton Evangelatov

0

我想我找到了一个解决方法。 如果你配置bundler使用pry作为控制台,只需执行以下命令:

$ bundle config console pry

然后pry本身就被要求了,你不需要在源文件中显式地要求它。
此外,按下“↑”键可以获得历史记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接