Phoenix上下文边界验证Skill phx:boundaries

此技能用于在Phoenix框架中验证上下文边界和依赖关系,通过工具如mix xref分析代码结构,确保良好的软件架构和清晰的模块分离。关键词:Phoenix、Elixir、上下文边界、依赖分析、架构验证、代码审查、软件设计。

后端开发 0 次安装 0 次浏览 更新于 3/11/2026

名称: phx:boundaries 描述: 使用mix xref验证Phoenix上下文边界和依赖关系。在审查PR或进行重大重构时使用。 参数提示: [–assess|–fix]

Phoenix上下文边界验证

分析模块依赖关系以确保清晰的上下文分离和适当的架构边界。

用法

/phx:boundaries              # 检查违规
/phx:boundaries --assess     # 评分上下文健康度 (0-100)
/phx:boundaries --fix        # 建议修复违规

--assess 模式: 上下文健康度评分

使用量化评分评估整体边界健康度。

计算指标

指标 健康范围 红色标志 权重
每个上下文的模块数 3-15 >20 或 <2 20%
公共API表面 5-30 函数 >40 函数 15%
扇出 (调用的上下文数) 1-4 >6 20%
扇入 (被上下文调用的次数) 1-6 >10 15%
循环依赖 0 >0 15%
边界违规 0 >0 15%

评估命令

# 每个上下文的模块计数
for dir in lib/my_app/*/; do
  echo "$(basename $dir): $(find $dir -name '*.ex' | wc -l) 模块"
done

# 每个上下文的公共函数计数
for f in lib/my_app/*.ex; do
  echo "$(basename $f): $(grep -c '^  def ' $f 2>/dev/null || echo 0) 公共函数"
done

# 依赖分析
mix xref graph --format stats

# 循环依赖
mix xref graph --format cycles

输出格式

## 上下文健康度评估

### 整体得分: 82/100 (良好)

| 上下文 | 模块数 | API | 扇出 | 扇入 | 得分 |
|---------|---------|-----|---------|--------|-------|
| 账户 | 5 | 12 | 2 | 4 | 95 |
| 订单 | 18 | 45 | 8 | 3 | 62 |
| 共享 | 2 | 8 | 0 | 12 | 78 |

### 发现的问题

1. **订单** - 过大 (18 模块, 45 函数)
   - 考虑: 提取履行、发票子上下文

2. **订单** - 高扇出 (8 上下文)
   - 考虑: 审查是否所有依赖必要

### 建议

- 将订单拆分为订单 + 履行
- 审查账户 ← 计费依赖

铁律 - 永不违反这些

  1. 控制器仅调用上下文 - 从Web层无直接Repo访问
  2. 模式是纯数据 - 无副作用,模式模块中无Repo调用
  3. 上下文拥有其模式 - 不从其他上下文导入模式
  4. 仅显式依赖 - 跨上下文调用必须是有意的

依赖规则

可以调用 不能调用
控制器 上下文、Plug、Conn 直接Repo、模式
LiveViews 上下文、组件、PubSub 直接Repo、模式
上下文 自有模式、Repo、其他上下文 Web层模块
模式 Ecto类型、验证 上下文、Repo

分析命令

检查编译依赖

mix xref graph --label compile-connected

查找依赖某个上下文的内容

mix xref graph --sink MyApp.Accounts --label compile

查找模块调用的内容

mix xref callers MyApp.Accounts.get_user!/1

检查循环依赖

mix xref graph --format cycles

检测红色标志

从Web层直接Repo访问

grep -r "Repo\." lib/my_app_web/ --include="*.ex"

如果找到: 移动到上下文模块。

模式包含查询

grep -r "import Ecto.Query" lib/my_app/**/schemas/ --include="*.ex"

如果找到: 将查询移动到上下文。

跨上下文模式导入

grep -r "alias MyApp.OtherContext.Schema" lib/my_app/my_context/

如果找到: 改为调用其他上下文的API。

LiveView中的业务逻辑

grep -r "Repo\.\|Ecto\.Multi" lib/my_app_web/live/ --include="*.ex"

如果找到: 提取到上下文函数。

边界验证流程

  1. 运行 mix xref graph --label compile-connected 进行概述
  2. 检查上下文交叉污染
  3. 验证从Web层无直接Repo调用
  4. 确保模式无副作用
  5. 验证显式跨上下文依赖

参考文献

详细模式,参见:

  • references/context-design.md - 上下文设计原则
  • references/refactoring-boundaries.md - 修复边界违规