【发布时间】: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 代码,因为它显示了外部代码块如何决定连接的内容。 (这是猜测,不是答案)