我应该依赖宝石吗?

时间:2016-02-10 06:12:22

标签: ruby rubygems

假设有一个gem为Warden实现身份验证策略,或者为Paperclip或ActiveRecord数据库适配器实现存储引擎。它应该包括它应该作为常规依赖使用的宝石吗?如果是这样,版本限制应该是什么?它当然必须包含“父”宝石作为开发依赖,但是常规宝石呢?

1 个答案:

答案 0 :(得分:1)

这完全取决于你。除非您依赖代码来存在gem(读取:使用if const_defined?('Paperclip')或类似代码包围所有代码),否则您的gem可能会优雅地拒绝操作,除非目标项目中已包含必要的依赖项。该版本应与您对代码进行测试的版本相对应。

作为直接依赖 不是一个好选择的情况的一个很好的例子,它将是“伞形”宝石,简化了与不同的授权引擎的工作。人们不会要求所有这些设备,专家和家人。相反,应该做“聪明”的初始化:

case
when Kernel.const_defined?('Devise')
  Logger.debug 'Will initialize Devise bridge.'
  # initialization of bindings etc.
when Kernel.const_defined?('Pundit')
  Logger.debug 'Will use Pundit bridge.'
  # initialization of bindings etc.
...
else
  Logger.warn 'No authorization backend found.'
  raise 
end

或者,想象一下可能发送空气制动器的记录器。为了使记录仪运行,空气制动器的存在并不重要。因此,可以检查目标项目中是否存在airbrake gem,并在成功时切换附加功能。

希望它有所帮助。

相关问题