在运行时,在完成捆绑器设置并应用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的任何文档。源代码中的注释很有帮助,但主要关注数据类型等。
答案 0 :(得分:14)
Bundler用于设置应用程序gem,因此您可以使用Gem
API而不是Bundler
:
Gem.loaded_specs.has_key? gem_name
Bundler将进行设置,以便捆绑中的任何宝石(在适当的组中)已被激活(因此它们将在loaded_specs
中具有条目)并且将阻止任何其他(非捆绑)宝石从被装载。