这是一个指导编写 Ruby gem 的技能,遵循 Andrew Kane 在 100 多个 gem(如 Searchkick、PgHero、Chartkick 等)中总结的实践。
用途:新建 Ruby gem、重构或维护 gem,或按该风格做 Rails 集成时使用。
核心原则:简洁优于取巧;零依赖或最少依赖;显式代码优于元编程;可集成 Rails 但不与 Rails 耦合;每个模式都服务于生产场景。
主要模式:
- 入口文件 lib/gemname.rb:先 require 依赖(优先标准库),再 require_relative 内部模块与 version,然后仅在 defined?(Rails) 时条件加载 railtie,最后定义模块配置与错误类,默认可立即设置(如 self.timeout = 10)。
- 类宏 DSL:单个类方法配置全部(如 searchkick word_start: [:name]),实现时校验未知关键字并抛 ArgumentError,用 Module.new 与 define_method 注入方法,避免 method_missing。
- Rails 集成:用 ActiveSupport.on_load(:active_record),不要直接 require Rails 组件;行为修改用 prepend。
- 配置:用 class << self 与 attr_accessor,不用 Configuration 对象。
- 错误:简单继承层级加清晰消息,构造时用 ArgumentError 提前校验。
- 测试:仅用 Minitest,test_helper 中 Bundler.require 与 minitest/autorun。
- gemspec:尽量零运行时依赖,开发依赖放 Gemfile,不提交 Gemfile.lock。
应避免:method_missing、配置对象、@@class_variables、直接 require Rails、过多运行时依赖、RSpec、重型 DSL。
限制:该资料未说明适用 Ruby 之外的语言,也未提供版本、收费或平台信息;具体参考文件(模块组织、Rails 集成、数据库适配器、测试模式)以描述的 references 目录为准。