GraphQL架构差异检测与分析Skill graphql-inspector-diff

此技能用于检测GraphQL架构版本之间的变化,包括重大、非重大和危险变化,帮助团队防止API回归、比较跨分支架构或验证迁移。关键词:GraphQL、架构比较、差异检测、API版本控制、迁移验证、CI/CD集成。

架构设计 0 次安装 0 次浏览 更新于 3/25/2026

名称: graphql-inspector-diff 用户可调用: false 描述: 用于检测GraphQL架构版本之间的重大变化、跨分支比较架构或验证架构迁移时使用。 允许工具: [读取, 写入, 编辑, Bash, Glob, Grep]

GraphQL检查器 - 架构差异

GraphQL检查器的diff命令的专家知识,用于检测GraphQL架构版本之间的重大、非重大和危险变化。

概述

GraphQL检查器的diff命令比较两个GraphQL架构,并输出精确的变化列表。每个变化被分类为重大、非重大或危险,帮助团队防止API回归。

核心命令

基本差异

# 比较两个架构文件
npx @graphql-inspector/cli diff old-schema.graphql new-schema.graphql

# 与git分支比较
npx @graphql-inspector/cli diff 'git:origin/main:schema.graphql' schema.graphql

# 与特定提交比较
npx @graphql-inspector/cli diff 'git:abc123:schema.graphql' schema.graphql

# 与标签比较
npx @graphql-inspector/cli diff 'git:v1.0.0:schema.graphql' schema.graphql

基于URL的比较

# 将本地架构与远程端点比较
npx @graphql-inspector/cli diff 'https://api.example.com/graphql' schema.graphql

# 比较两个远程端点
npx @graphql-inspector/cli diff 'https://staging.api.com/graphql' 'https://prod.api.com/graphql'

命令选项

# 仅显示重大变化
npx @graphql-inspector/cli diff old.graphql new.graphql --onlyBreaking

# 在危险变化时失败
npx @graphql-inspector/cli diff old.graphql new.graphql --failOnDangerous

# 自定义规则
npx @graphql-inspector/cli diff old.graphql new.graphql --rule suppressRemovalOfDeprecatedField

# 输出为JSON
npx @graphql-inspector/cli diff old.graphql new.graphql --json

变化类别

重大变化

会破坏现有客户端的变化:

变化类型 示例
字段移除 User.email 被移除
类型移除 UserType 被删除
必需参数添加 查询上新增 id: ID!
类型更改 User.age: IntUser.age: String
非空约束添加 email: Stringemail: String!
联合成员移除 SearchResult 失去 Product 类型
枚举值移除 Status.PENDING 被移除
接口字段移除 Node.id 从接口移除

危险变化

可能破坏某些客户端的变化:

变化类型 示例
参数默认值更改 limit = 10limit = 20
枚举值添加 新增 Status.ARCHIVED
可选参数添加 新增 User.name(format: String)
联合成员添加 SearchResult 获得 Article 类型
接口添加到类型 User 实现 Timestampable
可空字段变为非空 email: Stringemail: String! 在输出上

非重大变化

不会破坏客户端的更改:

变化类型 示例
字段添加 新增 User.avatar 字段
类型添加 新增 Comment 类型
可选参数添加 新增 users(filter: String)
弃用添加 @deprecated(reason: "使用newField")
描述更改 更新的字段文档
指令添加 @cacheControl(maxAge: 60)

配置

规则配置

创建 .graphql-inspector.yaml

diff:
  rules:
    - suppressRemovalOfDeprecatedField
    - considerUsage
  failOnBreaking: true
  failOnDangerous: false

可用规则

# 抑制规则
- suppressRemovalOfDeprecatedField  # 可以移除弃用的字段
- suppressCommonPrefixChanges       # 忽略前缀重命名

# 基于使用的规则
- considerUsage                     # 检查重大变化是否影响实际使用

架构源

# 本地文件
old: ./old-schema.graphql

# Git引用
old: git:origin/main:schema.graphql

# 带头的URL
old:
  url: https://api.example.com/graphql
  headers:
    Authorization: Bearer ${API_TOKEN}

# Glob模式
new: ./**/*.graphql

CI/CD集成

GitHub Actions

name: 架构差异
用户可调用: false
on:
  pull_request:
    paths:
      - 'schema.graphql'
      - '**/*.graphql'

jobs:
  diff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 安装检查器
        run: npm install -g @graphql-inspector/cli

      - name: 检查重大变化
        run: |
          graphql-inspector diff \
            'git:origin/main:schema.graphql' \
            schema.graphql \
            --onlyBreaking

GitLab CI

架构差异:
  image: node:20
  script:
    - npm install -g @graphql-inspector/cli
    - graphql-inspector diff "git:origin/main:schema.graphql" schema.graphql
  rules:
    - changes:
        - "**/*.graphql"

基于使用的差异检测

检查重大变化是否影响实际操作:

# 提供操作以检查
npx @graphql-inspector/cli diff old.graphql new.graphql \
  --rule considerUsage \
  --documents "src/**/*.graphql"

好处:

  • 仅标记影响实际操作的重大变化
  • 允许安全移除未使用的字段
  • 在大型架构中减少误报

联合支持

对于Apollo联合架构:

# 比较联合架构
npx @graphql-inspector/cli diff \
  --federation \
  old-subgraph.graphql \
  new-subgraph.graphql

最佳实践

  1. 部署前始终差异 - 在每次架构更改时在CI中运行差异
  2. 使用Git引用 - 与主分支比较,而非任意文件
  3. 启用使用检查 - 通过检查实际使用减少噪音
  4. 记录弃用 - 在移除字段前添加 @deprecated
  5. 审查危险变化 - 它们可能仍会破坏边缘情况
  6. 保持弃用窗口 - 给客户端时间迁移
  7. 自动化在PR中 - 在拉取请求上评论差异结果
  8. 版本化你的架构 - 标记发布以便轻松比较

常见模式

弃用工作流

# 步骤1: 添加新字段并弃用旧字段
type User {
  fullName: String!
  name: String @deprecated(reason: "使用fullName代替")
}

# 步骤2: 迁移窗口后,移除旧字段
type User {
  fullName: String!
}

安全字段重命名

# 阶段1: 添加别名并弃用旧名称
type User {
  displayName: String!
  name: String @deprecated(reason: "使用displayName")
}

# 阶段2: 客户端迁移后移除
type User {
  displayName: String!
}

故障排除

常见问题

“架构未找到”

  • 验证文件路径正确
  • 检查Git引用语法:git:branch:path
  • 确保架构文件存在于指定位置

“CI中检测到重大变化”

  • 审查变化是否是有意的
  • 如果移除字段,添加弃用
  • 如果字段已被弃用,使用 --rule suppressRemovalOfDeprecatedField

“内省查询失败”

  • 检查URL是否可访问
  • 验证身份验证头部
  • 确保端点上启用了内省

何时使用此技能

  • 规划架构迁移
  • 审查拉取请求中的架构更改
  • 设置CI/CD以进行架构验证
  • 检测部署前的重大变化
  • 比较生产与开发架构
  • 审计架构随时间演变