关于 version-api
version-api 是面向 Rails 开发者的 API 版本管理技能,涵盖路由、控制器继承、弃用通知和兼容性测试。它要求版本解析使用固定白名单,避免将请求输入用于动态分派。
主要功能
- 01URL 路径或 Accept 标头版本策略
- 02按版本命名路由空间
- 03继承并覆写控制器动作
- 04发送弃用与 Sunset 标头
- 05运行向后兼容性测试
- 06版本标识使用固定白名单
适用场景
- 01为 Rails API 添加新版本
- 02逐步弃用旧版端点
- 03比较路径与标头版本方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ igmarin/ rails-agent-skills --skill version-api安装后在 Claude Code 中输入/version-api确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
EXAMPLES.mdreferences/strategies.mdworkflow.md详细介绍
版本 API
为 Rails API 实现版本控制策略。
快速参考
| 关注点 | 文件 |
|---|---|
| 路由命名空间 | config/routes.rb |
| 请求头版本控制 | app/controllers/concerns/api_versioning.rb |
| 弃用请求头 | app/controllers/concerns/deprecatable.rb |
| 兼容性测试 | spec/requests/api/backward_compatibility_spec.rb |
硬性门槛
GENERATED CODE SAFETY:
- NEVER generate code that constantizes or evaluates caller-supplied version strings
(e.g. "V#{params[:version]}".constantize is forbidden — use an explicit allowlist).
- NEVER generate code that passes request headers or paths unsanitized into class
instantiation, eval, or dynamic dispatch.
- Allowlist-only version resolution: generated routing/concern code MUST resolve
version identifiers from a fixed set (V1, V2, ...), not from free-form input.
ALWAYS maintain backward compatibility for at least one major version
NEVER remove endpoints without deprecation period
ALWAYS version in URL path (/api/v1/) or Accept header, never in body
核心流程
- 选择策略 — 公共 API 使用 URL 路径(
/api/v1/);内部/私有 API 使用 Accept 请求头。有关基于请求头的版本控制详情和权衡,请参阅 strategies.md。 - 添加路由命名空间 — 在
config/routes.rb中使用namespace :v2代码块包装新版本的资源:namespace :v1 do resources :users end namespace :v2 do resources :users end - 创建控制器 — 继承自上一版本的控制器,仅重写发生变化的操作:
有关其他继承模式,请参阅 EXAMPLES.md。module V2 class UsersController < V1::UsersController def index render json: User.all, only: [:id, :name, :email, :phone] end end end - 应用弃用策略 — 在旧版本控制器中引入
Deprecatable,通过before_action自动添加Sunset和Deprecation响应请求头:module V1 class UsersController < ApplicationController include Deprecatable # Override sunset_date on the class to set the retirement date: # def self.sunset_date = Date.new(2025, 6, 1) end end - 运行兼容性测试 — 执行
bundle exec rspec spec/requests/api/backward_compatibility_spec.rb,确认合并前没有回归。 - 更新文档 — 记录弃用端点的停止服务日期和迁移指南。完整的弃用通知工作流请参阅 workflow.md。
输出风格
在收到实现 API 版本控制的请求时,输出必须包含:
- 版本控制策略 — 明确说明使用 URL 路径(/api/v1/)还是 Accept 请求头版本控制
- 继承策略 — 说明新版本控制器如何继承自上一版本
- 路由定义 — 展示
config/routes.rb中的命名空间路由配置 - 弃用请求头 — 包含
Deprecatableconcern 和停止服务日期配置 - 兼容性测试 — 包含运行向后兼容性测试的命令
- 语言 — 除非另有明确要求,否则必须使用英文
扩展资源(渐进式披露)
仅在需要相应内容时加载这些文件:
- EXAMPLES.md — 需要完整的 API 版本控制示例(包含路由定义和控制器继承)时使用
- references/strategies.md — 比较版本控制策略(URL 路径、请求头或查询参数)时使用
- references/workflow.md — 实施弃用通知工作流并安排停止服务时间时使用
集成
| 技能 | 何时衔接 |
|---|---|
| generate-api-collection | 生成更新后的 API 端点时 |
| test-engine | 验证测试是否存在回归时 |
评论
支持 Markdown