【问题标题】:Programmatically check if gem in bundle?以编程方式检查宝石是否在捆绑中?
【发布时间】:2014-12-16 17:11:44
【问题描述】:

在运行时,捆绑器设置完成并应用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 的任何文档。源中的注释很有帮助,但侧重于数据类型等。

【问题讨论】:

  • 即使它已经在捆绑包中,也不意味着它当前已安装。我不认为你可以摆脱拯救 LoadError。
  • 好点,但为了科学,我们假设这与 LoadError 无关;)
  • 您可能需要查看用于绘图的 Bundler GraphViz 代码,因为它显示了外部代码块如何决定连接的内容。 (这是猜测,不是答案)

标签: ruby rubygems bundler


【解决方案1】:

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

Gem.loaded_specs.has_key? gem_name

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

【讨论】:

  • 这是正确的检查方法。 Bundler 目前不提供官方的公共 Ruby API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 2011-06-28
  • 2015-02-06
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多