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

Jar*_*eck 7 ruby rubygems bundler

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

通过阅读来源,我发现Bundler.definition,例如

gem_name = 'banana'
Bundler.definition.dependencies.map(&:name).include?(gem_name)
Run Code Online (Sandbox Code Playgroud)

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

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

Bundler.load.dependencies_for(:default, Rails.env).map(&:name).include?(gem_name)
Run Code Online (Sandbox Code Playgroud)

但是,在每个呼叫站点复制"组列表"似乎是个坏主意.理想情况下,我想要一种方法Bundler,不要求我指定当前组.

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

mat*_*att 14

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

Gem.loaded_specs.has_key? gem_name
Run Code Online (Sandbox Code Playgroud)

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

  • 这是检查的正确方法.Bundler目前不提供官方公共Ruby API. (3认同)