关于 rust-systems
面向使用 edition 2024 的应用层 Rust 开发,涵盖 CLI、Web 服务和库。重点包括安全且精简的改动、并发与错误处理,以及格式、静态检查和测试验证。
主要功能
- 01CLI、服务和库的开发指导
- 02unsafe 代码安全与审查规则
- 03异步并发和关闭处理实践
- 04错误处理与解析指导
- 05格式、静态检查和测试要求
适用场景
- 01开发 edition 2024 Rust CLI
- 02审查 Rust Web 服务改动
- 03处理 unsafe 代码或原始指针
- 04交付前验证 Rust 工作区
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ iliaal/ ai-skills --skill rust-systems安装后在 Claude Code 中输入/rust-systems确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
SPEC.mdreferences/applications-and-testing.mdaxum-service.mdbuild-profiles.mdci-pipeline.mdcli-tools.mdmacros-and-os-boundaries.mdobservability.mdownership-and-execution.mdperformance.mdproduction-resilience.mdrustdoc.mdtoolchain-and-interfaces.md详细介绍
Rust 系统与服务
涵盖现代应用层 Rust(edition 2024):命令行工具、Web 服务、库。不包括 no_std/嵌入式开发。
工作规则
- 在库中保留错误变体,并在应用边界补充运行上下文。
- 写入替代内容前,区分配置缺失与文件不可读或无效的情况。
- 避免在异步工作线程上执行阻塞任务,限制队列和派生任务,并定义关闭行为。
- 将变更视为内部变更前,先追踪导出的接口;验证已安装运行时具备的能力。
- 不要在并发测试中修改进程级状态;实际运行二进制文件,并测试相关的功能组合。
不安全代码规范
- 默认不使用
unsafe。如果 clippy 标记了问题,不要用#[allow]忽略;应重构。下文的#[expect]例外不适用于此处;不安全代码问题应修复,而不是添加注解。 - 每个
unsafe块上方都要添加// SAFETY:注释,说明各项不变量为何成立。没有注释 = 审核不通过。 - 尽量缩小
unsafe块:在模块边界将其封装为安全抽象,并将模块标记为pub(crate)。 - 对包含
unsafe或原始指针运算的 crate 使用miri(cargo +nightly miri test);它能捕获被优化器掩盖的未定义行为。 - 对于零拷贝模式,优先使用
bytemuck、zerocopy、bytes,而不是手动编写 transmutes。 - 在 edition 2024 中,写入环境变量属于
unsafe。只能在main中、运行时启动或任何线程派生之前写入。 并发调用getenv会产生未定义行为;OnceLock并不能使其安全。注意首次使用时延迟写入LD_LIBRARY_PATH一类变量的情况;应将其提前到启动阶段。
规范
- 简单优先:每项变更都应尽可能简单,尽量减少影响代码。
- 只修改必要内容;避免在 PR 中进行无关变更。
- 不要用
#[allow(clippy::...)]走捷径;应修复根本问题。确实需要抑制时,改用#[expect(clippy::lint_name, reason = "...")]:如果 lint 不再触发,expect会发出警告,因此失去原有原因的抑制会自行报告,而allow则会永远悄然失效。(expect需要 Rust 1.81+;edition 2024 已满足这一最低版本要求。) - 添加 trait 或泛型前,先确认至少有 3 处会用到它。否则,具体类型会更清晰。
bool::then_some(x)会按值接收x:无论布尔值如何,都会先计算参数。 因此,将条件与固定宽度切片组合成保护条件,会恰好在条件要检查的输入上触发 panic:(b.len() >= 19 && b[4] == b'-').then_some(&v[..19])会对任何更短的值触发 panic,使程序在本应报告结果未定的函数中以状态码 101 退出。应使用惰性求值的then(|| …)。Clippy 不会标记这一区别。使用 grep 搜索then_some(,检查参数是否包含索引、切片、unwrap或分配操作。另请注意:固定宽度切片并不等于解析。&v[..19]也会在非 ASCII 字符中间触发 panic;对两个这样的前缀进行字典序比较会丢弃时区偏移,因此01:00+02:00会排在00:00Z之后,尽管它实际早了 1 小时。应解析并规范化,或直接拒绝。
验证
cargo fmt --all -- --check通过,且差异为零cargo clippy --workspace --all-targets --all-features -- -D warnings通过cargo nextest run --workspace(或cargo test --workspace)通过,且失败数为零- 使用 nextest 时,
cargo test --doc --workspace也必须通过;nextest 不会运行文档测试 - 对于任何将用于生产环境的 crate,
cargo deny check通过(许可证、公告、重复依赖项) - 新增的
unsafe均有// SAFETY:注释
特定任务参考
实现或审查相关行为前,请先阅读对应的参考文档:
- 对于 Cargo 配置、工作区变更、公共 API 可达性、构建配置或 CI:请参阅 toolchain-and-interfaces.md。
- 对于错误、所有权、解析边界、Tokio、关闭或并发:请参阅 ownership-and-execution.md。
- 对于 CLI/服务入口、生产环境韧性、遥测或测试:请参阅 applications-and-testing.md。
适用时,请参阅现有的专项参考文档:
评论
支持 Markdown