Public API compatibility checks for MoonBit packages.
Dependencies
A public API compatibility guard for MoonBit packages, powered by the formal .mbti interfaces generated by moon info.
| 项目 | 能力 |
|---|---|
| 输入 | 两个 .mbti 文件,或两个包含 .mbti 的目录 |
| 检测 | 函数、关联方法、struct、enum、type alias、trait、impl、公开字段等 |
| 结果 | breaking / compatible 分类、变更明细、SemVer 建议 |
| 报告 | Text、Markdown、JSON、HTML、SARIF 2.1.0 |
| CI 行为 | 兼容返回 0;发现破坏返回 1;参数或文件错误返回 2 |
| 策略 | 默认严格保护穷举匹配,也支持 allow / ignore 和 JSON 策略文件 |
| 验证 | 115 个测试;Linux、macOS、Windows CI;check / test / build / fmt / info |
./scripts/acceptance.sh| 验收反馈 | 当前实现与证据 |
|---|---|
| 不同类型的同名关联方法产生误报 | 比较标识使用 Type::method 限定名;真实解析回归夹具位于 fixtures/regression/ |
| enum 新增 variant 被误判为兼容 | variant-added 默认是 breaking,避免下游穷举匹配漏报;payload 改动另报 variant-changed |
| CI 未覆盖 moon build,格式门禁失败 | check.yml 在三种系统运行 check / test / build / examples,并用 git diff --exit-code 验证 fmt / info |
| GitHub 无工作流 | .github/workflows/ 包含主 CI、API Guard、可复用工作流和 Pages 部署 |
| 包发布、许可证、参考范围不完整 | 包页面、Apache-2.0 LICENSE 与含许可证/参考范围的 References 均已列明 |
flowchart LR
A["旧版 .mbti"] --> P["解析与规范化"]
B["新版 .mbti"] --> P
P --> I["ApiItem<br/>kind + qualified identity"]
I --> R["语义兼容规则"]
R --> C["策略覆盖<br/>allow / ignore / strict"]
C --> O["ApiReport"]
O --> E["退出码与 SemVer 建议"]
O --> F["Text / Markdown / JSON<br/>HTML / SARIF"]git clone https://github.com/FidollarinLA/moon_api_guard.git
cd moon_api_guard
moon update
# 比较两个文件;示例夹具包含破坏性变更,因此预期退出码为 1
moon run cmd/main -- check fixtures/old_api.mbti fixtures/new_api.mbti
# 比较目录并生成 SARIF
moon run cmd/main -- check-dir fixtures/dir_old fixtures/dir_new \
--format sarif --output api-guard.sarif./scripts/demo.sh
moon run examples/basic
moon run examples/semanticsmoon add FidollarinLA/moon_api_guard@0.6.0let report = @lib.compare_mbti_content(old_mbti_text, new_mbti_text)
println(report.breaking_count())
println(report.compatible_count())
println(report.semver_suggestion())
println(report.release_blocked())///|
let old_api = @lib.parse_mbti_content(old_mbti_text)
///|
let new_api = @lib.parse_mbti_content(new_mbti_text)
///|
let report = @lib.compare_api(old_api, new_api)moon run cmd/main -- check <old.mbti> <new.mbti> [options]
moon run cmd/main -- check-dir <old-dir> <new-dir> [options]
moon run cmd/main -- baseline update <source.mbti> <baseline.mbti># 只输出破坏性变化
moon run cmd/main -- check old.mbti new.mbti --breaking-only --format json
# 显式允许新增 enum variant,同时启用严格策略
moon run cmd/main -- check old.mbti new.mbti --allow variant-added --strict
# 从 JSON 文件载入团队策略
moon run cmd/main -- check old.mbti new.mbti --policy policies/api-policy.json
# 忽略内部目录并输出 HTML
moon run cmd/main -- check-dir old_dir new_dir \
--ignore-path '**/internal/**' --format html --output api-report.html| 退出码 | 含义 |
|---|---|
| 0 | 未发现破坏性变更 |
| 1 | 发现破坏性变更,release_blocked = true |
| 2 | 参数无效或文件读取失败 |
println(report.markdown_summary())
println(report.json_summary())
println(report.html_summary())
println(report.sarif_summary())moon info
moon run cmd/main -- check baseline/pkg.generated.mbti pkg.generated.mbtimoon run cmd/main -- baseline update \
pkg.generated.mbti baseline/pkg.generated.mbti| API | 用途 |
|---|---|
| parse_mbti_content / parse_mbti_items | 将 .mbti 文本解析成规范化 API 项 |
| compare_api / compare_mbti_content | 生成完整兼容性报告 |
| compare_mbti_content_with_policy | 使用团队自定义策略比较 |
| default_compat_policy / strict_compat_policy | 获取内置策略 |
| policy_allow / policy_ignore / policy_from_json_text | 构建或加载策略覆盖 |
| ApiReport::breaking_only / ApiReport::scoped | 过滤结果或附加文件作用域 |
| merge_api_reports | 合并目录内多个报告 |
| ApiReport::semver_suggestion / release_blocked | 生成版本建议与门禁信号 |
| ApiReport::*_summary | 生成 Markdown、JSON、HTML、SARIF 等报告 |
moon check --deny-warn
moon test --deny-warn
moon build
moon run examples/basic
moon run examples/semantics
moon info
moon fmt
git diff --exit-code./scripts/acceptance.shmoon login
moon publish --dry-run
moon publish| Project | Link | License | Scope of reference |
|---|---|---|---|
| cargo-semver-checks | https://github.com/obi1kenobi/cargo-semver-checks | Apache-2.0 / MIT | SemVer 与 breaking-change 分类思路 |
| japicmp | https://github.com/siom79/japicmp | Apache-2.0 | 库发布时的 API diff 报告组织方式 |
| Revapi | https://github.com/revapi/revapi | Apache-2.0 | CI 集成与版本升级建议 |
let item = api_item("fn", "parse", "pub fn parse(String) -> Int")let report = compare_mbti_content(old_mbti, new_mbti)
assert_eq(report.semver_suggestion(), "major")fn compare_mbti_content_with_policy(old_content : String, new_content : String, policy : CompatPolicy) -> ApiReportfn path_is_ignored(path : String, patterns_csv : String) -> Boolfn path_matches_ignore_pattern(path : String, pattern : String) -> Bool{
"strict": false,
"allow": ["variant-added"],
"ignore": ["deprecated"]
}Public API compatibility checks for MoonBit packages.
Dependencies