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

时间:2014-12-16 17:11:44

标签: ruby rubygems bundler

在运行时,在完成捆绑器设置并应用groups之后,以编程方式检查给定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的任何文档。源代码中的注释很有帮助,但主要关注数据类型等。

1 个答案:

答案 0 :(得分:14)

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

Gem.loaded_specs.has_key? gem_name

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