我应该依赖我正在扩展的宝石吗?

Should I depend on gems I'm extending?

假设 gem 为 Warden 或 Paperclip 的存储引擎或 ActiveRecord 数据库适配器实施身份验证策略。它应该包括它应该作为常规依赖项使用的 gems 吗?如果是这样,版本约束应该是什么?它当然必须包括 "parent" gems 作为开发依赖项,但是常规的呢?

一切由你决定。除非你的代码依赖于 gem 的存在(阅读:用 if const_defined?('Paperclip') 或类似的东西包围你的所有代码),否则你的 gem 可能会优雅地拒绝操作,除非必要的依赖项已经包含在目标项目。该版本应与您测试代码的版本相对应。

作为直接依赖 不是 好的选择的一个很好的例子,“保护伞” 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

或者,想象一下记录器,它可能会发出减速板。对于记录器的操作,空气制动装置的存在并不重要。因此,可以检查目标项目中是否存在空气制动器 gem,并在成功时打开附加功能。

希望对您有所帮助。