以编程方式检查gem中是否包含gem?

在运行时,在完成捆绑器设置并应用组之后,以编程方式检查给定gem_name是否在捆绑中的最佳方法是什么?

通过阅读源代码,我发现了Bundler.definition ,例如

 gem_name = 'banana' Bundler.definition.dependencies.map(&:name).include?(gem_name) 

但无法找到文档1 ,我不知道这是否是推荐用法。

更新:看起来Bundler::Definition#dependencies返回所有依赖项,而不管组。 作为替代方案,我发现了Bundler::Runtime#dependencies_for ,它将组作为参数。

 Bundler.load.dependencies_for(:default, Rails.env).map(&:name).include?(gem_name) 

但是,在每个呼叫站点复制“组列表”似乎是个坏主意。 理想情况下,我想在Bundler中使用一种方法,不需要我指定当前组。

1 bundler网站和手册页专注于命令行使用。 我还没有找到有关gem的公共ruby API的任何文档。 源代码中的注释很有帮助,但主要关注数据类型等。

Bundler用于设置应用程序gem,因此您可以使用Gem API而不是Bundler

 Gem.loaded_specs.has_key? gem_name 

Bundler将进行设置,以便捆绑中的任何gem(在适当的组中)已被激活(因此它们将在loaded_specs具有条目)并且将阻止加载任何其他(非捆绑)gem。