diff --git a/.github/workflows/guards.yml b/.github/workflows/guards.yml index 1f08c31..eebb723 100644 --- a/.github/workflows/guards.yml +++ b/.github/workflows/guards.yml @@ -3,7 +3,7 @@ name: Guards # 架构与合规守门(与 fmt/clippy 同级,不允许 continue-on-error): # 1. core-no-ui —— crates/core 零 UI 依赖(D3 铁律),依赖表 + cargo tree 双查 # 2. presenter-no-ui —— crates/presenter 零 UI 依赖(D26 / M85):Slint 版与 iced 版共用的宿主层 -# 3. design-zero-dep —— crates/design 零第三方依赖(M61 / M87):依赖树只允许出现自身 +# 3. design-zero-dep —— crates/design 零第三方依赖(M61 / M87):依赖表(含 dev/build)必须为空 + 依赖树只允许出现自身 # 4. file-size —— 全仓代码/文档单文件 ≤400 行(用户硬约束) # 5. licenses —— cargo-deny:许可证白名单 + GPL 依赖拦截 + 供应链来源校验 @@ -100,12 +100,35 @@ jobs: # unlucky-design 是「纯数据 + 纯函数、零第三方依赖」的设计令牌层,这是 README 明写的卖点 # (连 serde 都不加),但目前只靠人肉守。零依赖的判据比 UI 名单更硬:依赖树只允许有自己一行。 + # 注意 `cargo tree --edges normal` 看不到 dev/build 依赖,所以另设一步按表头切依赖表逐个查空。 design-zero-dep: name: design 零第三方依赖守门 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable + - name: 依赖表必须为空(dependencies / dev / build 表一律不许有键,含子表写法) + run: | + set -uo pipefail + # design 承诺的是「零第三方依赖」,不分 normal / dev / build —— 而 cargo tree + # --edges normal 对 dev/build 是瞎的。所以先按表头切出全部依赖表(含 + # `[dependencies.serde]` 这类子表写法,表头本身携带包名),再看是否为空。 + awk ' + /^[[:space:]]*\[/ { + in_deps = ($0 ~ /^[[:space:]]*\[(target\..*\.)?(dependencies|dev-dependencies|build-dependencies)(\.[^]]*)?\][[:space:]]*$/) + if (in_deps && $0 ~ /\.[^]]*\]/) printf "%d:%s\n", NR, $0 + next + } + in_deps && !/^[[:space:]]*#/ && !/^[[:space:]]*$/ { printf "%d:%s\n", NR, $0 } + ' crates/design/Cargo.toml > /tmp/design-deps.txt + if [ -s /tmp/design-deps.txt ]; then + cat /tmp/design-deps.txt + echo "::error file=crates/design/Cargo.toml::unlucky-design 的依赖表必须为空(normal / dev / build 都算),本次命中:" + sed 's/^/ - /' /tmp/design-deps.txt + echo "::error::design 是纯数据 + 纯函数的设计令牌,README 对外承诺零第三方依赖(连 serde 都不加):色彩 / 排版 / 形状 / 高程 / 动效请不要引入任何 crate,测试与构建辅助依赖同样不许加。序列化与运行时能力放到消费方(app / app-iced / presenter)。" + exit 1 + fi + echo "OK: crates/design/Cargo.toml 依赖表全空(含 dev / build)" - name: 依赖树只允许出现自身(cargo tree -p unlucky-design --edges normal) run: | set -uo pipefail