Devlog · U-M0-01 rextendr 脚手架 + Cargo workspace(2026-09-28)
Source:vignettes/articles/devlog-2026-09-28-M0-01.qmd
做了什么
-
src/rust/ workspace:FFI 壳 crate 在根 +
engine/+catalog/成员;依赖冻结 = extendr-api 0.9.0(default-features=false + ndarray feature;crates.io 实核存在且声明 rust-version 1.71)+ ndarray 0.16 + rayon + memmap2,无 rand;engine/catalog#![forbid(unsafe_code)]、零 extendr;FFI 壳零用户可见导出;deny.toml(bans rand 族 + licenses + advisories 策略);vendor-config.tomloffline 模板;configure→tools/config.R→Makevars.in(string2path 模式,CARGO_BUILD_JOBS=2)。 -
R 侧最小骨架:DESCRIPTION(R ≥ 4.3、
SystemRequirements: cargo, rustc (>= 1.71)、cre 邮箱取自 git config)、R/msuiter-package.R、R/zzz.R(on_load 钩子骨架,注释标明 U-M0-03/09 接管点)、wrappers/NAMESPACE/man。 -
tools/:
check-dep-direction.sh(方向守卫,正负例均验证)、vendor.sh(--check漂移门)。
关键决策(契约引用)
-
FFI 壳 crate 位于 workspace 根而非 ARCH §2 树形图的
msuiter/子目录:rextendr 0.5 硬约定(document bin / entrypoint.c / 静态库名均派生自根 manifest,虚拟根会断rextendr::document())——ARCH §2 已加实现注记,D2(单包 + workspace)不变。 -
License 字段:
Apache License (>= 2.0)干净形式。实测+ file LICENSE触发”License components with restrictions not permitted”NOTE、干净形式触发”LICENSE is not mentioned”NOTE——各背 1 条良性 NOTE,取后者;M8 发布工程随 CRAN 反馈终审(D1 不变)。 -
advisories 策略:
unmaintained = "workspace"(paste 1.0.15 / RUSTSEC-2024-0421 经 extendr-api 0.9 传递,不阻断);升级 extendr-api 时复查全量 check(清单进 U-M0-08 CONTRIBUTING)。 -
方向契约四层强制:deny 全局禁 rand 族 + manifest 结构 + CRATE_ROLE 链接测试 +
tools/check-dep-direction.sh(cargo-deny 无 per-edge ban 能力;ARCH §2 措辞已同步修正)。
验收(【工程】逐条)
cargo build/test/clippy -D warnings 绿;cargo deny check 四节(bans/licenses/advisories/sources)绿;R CMD check –no-manual = 0 error / 0 warning / 1 NOTE(即上述 LICENSE NOTE);依赖清单逐项核对无 rand(Cargo.lock 零 rand 条目)。
审核(3 轮)
- REVISE:deny 全量未跑(licenses/advisories 实红:Unicode-3.0 缺失、manifest 无 license 字段、paste unmaintained)+ spike 证据在 /tmp 不可复现 → 修复(deny 全量绿;spike 入库,见 U-M0-02 devlog)。
-
REVISE:tools/spike/twobit-spike 内嵌
.git(embedded repo,源码不会被外层仓库版本控制)+ ARCH §2”deny ban 反向”与实际机制不符 + vendor.sh 无 exit 门 + configure.ac autoreconf 诱饵 → 修复(除 .git、加 check-dep-direction.sh、vendor.sh –check、configure.ac 并入 configure 注释、ADR/ARCH/PLAN 三处文档同步)。 - PASS(6 条 P2 随轮清理):ADR 测试计数笔误已改(workspace 实为 1 条测试)、criterion 声明失实已删、行数三处统一 244、守卫锚定加固并注入验证。审核员独立复现全部量化声称(含 vendor 三口径逐字节、守卫注入击中)。
遗留 → U-M0-07 认领清单(已写入 IMPLEMENTATION-PLAN U-M0-07 行)
-
.github/接线:check-dep-direction.sh、vendor.sh –check、deny 全量四节。 - matrixmultiply 钉版保护(dependabot 不得升至 ≥0.3.10,ADR 0002 §4.4)。
- rustc 1.71 × Linux/Windows 构建证明(ADR 0002 §5 残留)。
- LICENSE NOTE 终审权在 M8;本单元与 U-M0-02 全部工作未 git commit(等用户指示)。