名称: 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 上下文)
- 考虑: 审查是否所有依赖必要
### 建议
- 将订单拆分为订单 + 履行
- 审查账户 ← 计费依赖
铁律 - 永不违反这些
- 控制器仅调用上下文 - 从Web层无直接Repo访问
- 模式是纯数据 - 无副作用,模式模块中无Repo调用
- 上下文拥有其模式 - 不从其他上下文导入模式
- 仅显式依赖 - 跨上下文调用必须是有意的
依赖规则
| 层 | 可以调用 | 不能调用 |
|---|---|---|
| 控制器 | 上下文、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"
如果找到: 提取到上下文函数。
边界验证流程
- 运行
mix xref graph --label compile-connected进行概述 - 检查上下文交叉污染
- 验证从Web层无直接Repo调用
- 确保模式无副作用
- 验证显式跨上下文依赖
参考文献
详细模式,参见:
references/context-design.md- 上下文设计原则references/refactoring-boundaries.md- 修复边界违规