组件开发及管理规范 #371
ZCShou
started this conversation in
Code of Conduct
组件开发及管理规范
#371
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
组件开发及管理规范
一、概述
1.1 背景与目的
安全操作系统内核采用组件化架构设计,组件是功能相对独立且可独立测试的实体。目前,各个组件实际上是分散在了独立代码仓库的一个或多个 crate。为了规范组件的开发、管理和发布流程,特制定本规范。
将核心组件发布到 crates.io 的主要目的:
1.2 适用范围
本规范适用于所有核心组件的开发、管理和发布流程。
二、组件开发规范
2.1 代码注释规范
所有公开发布的组件必须提供由 rustdoc 生成的 API 文档。文档注释不仅是为了代码可读性,更是为了让用户能够通过
cargo doc生成完整的 API 参考文档。所有公开发布的 crate 应具备合理的文档注释:crate 级别文档:必须在
src/lib.rs顶部添加 crate 级别的文档注释,说明 crate 的用途、主要功能和基本使用方法公开模块文档:所有公开模块都应有模块级文档注释
公开 API 文档分级:
#[doc(hidden)]标记):可放宽文档要求文档验证:CI 中应包含文档检查命令,建议采用分阶段策略:
文档示例:文档中的示例代码应可运行,作为 doctest 的一部分:
2.2 测试规范
所有组件必须通过测试才能发布。针对系统软件的特殊性,测试分为三个层次:
2.2.1 单元测试
单元测试针对组件内部的 API 进行测试,验证各个函数和方法的正确性。
适用范围:
基本要求:
#[cfg(not(test))]或注释说明原因编写方式:
2.2.2 功能测试
功能测试通过模拟环境测试组件的功能,验证组件在接近真实场景下的行为。
适用范围:
基本要求:
编写方式:
2.2.3 系统测试
系统测试将组件集成到操作系统中进行测试,验证组件在真实环境下的完整功能。
适用范围:
基本要求:
tests/目录下编写集成测试编写方式:
2.2.4 文档测试
文档注释中的示例代码应作为 doctest 运行,确保文档示例的正确性:
2.2.5 测试运行要求
跨平台测试要求:
覆盖率检查(可选):
测试命令:
2.3 代码结构规范
模块划分:crate 内部应有合理的模块划分,建议避免过深或过浅的模块层级
API 设计:应清晰划分公共 API 与内部实现,避免无意中暴露内部接口
模块组织:相关功能应组织在同一模块内,保持高内聚低耦合
2.4 命名规范
遵循 Rust 命名规范:
snake_caseCamelCase(结构体、枚举、类型别名)snake_caseSCREAMING_SNAKE_CASE语义清晰:名称应准确表达其用途,避免歧义、模糊和通用的缩写
用户视角:公共接口的命名应以使用者角度考虑,做到易用、可理解、易检索
2.5 Cargo.toml 规范
每个 crate 的
Cargo.toml必须包含完整信息:2.6 提交信息规范
使用约定式提交(Conventional Commits)格式:
类型(type):
feat: 新功能fix: Bug 修复docs: 文档更新style: 代码格式(不影响代码运行的变动)refactor: 重构(既不是新增功能,也不是修复 bug)perf: 性能优化test: 增加测试chore: 构建过程或辅助工具的变动release: 发布版本示例:
三、组件仓库分支管理
3.1 分支规划
为不同版本规划清晰的分支结构,严格限制分支数量。
3.1.1 固定分支
每个组件仓库必须且只能维护以下永久分支:
main分支:维护稳定版本(如v0.1.x系列)dev分支:维护下一个大版本的开发版(如v0.2.0-pre.x)main分支发布3.1.2 临时分支
原则上不允许在组件仓库中建立其他分支。如确需建立临时分支,必须遵守以下规则:
命名规范:
feature/xxx- 新功能开发fix/xxx- Bug 修复hotfix/xxx- 紧急修复refactor/xxx- 代码重构使用原则:
dev分支进行新功能开发清理机制:
3.1.3 工作流程
功能开发流程:
dev分支进行新功能开发main分支版本发布流程:
dev分支的功能稳定后,合并到main分支main分支创建 Git Tag 发布正式版本补丁修复流程:
main分支进行 bug 修复3.2 版本发布与管理
所有版本发布必须通过 Git Tag 方式进行,这是组件版本管理的唯一正式方式。
3.2.1 版本号规范
发布版本号必须遵循 Semantic Versioning 2.0.0 规范:
3.2.2 Git Tag 发布规范
Tag 命名规范:所有版本 tag 必须以
v开头,格式为vX.Y.Z或vX.Y.Z-pre.Xv0.1.2、v0.2.0v0.2.0-pre.1、v0.2.0-preview.1Tag 与版本号一致性:Git tag 必须与
Cargo.toml中的版本号完全一致v0.1.2,则Cargo.toml中 version 必须为0.1.2Tag 创建时机:只有在准备发布到 crates.io 时才创建 tag
Tag 不可修改:已发布的 tag 严禁修改或删除
cargo yank撤销 crates.io 上的版本Tag 与分支对应关系:
v0.1.2、v0.2.0):必须在main或master分支创建v0.2.0-pre.1):必须在dev分支创建四、组件依赖管理
4.1 版本号规范
4.1.1 版本声明原则
必须使用 crates.io 版本号:所有已发布的组件依赖必须使用 crates.io 上的版本号,禁止使用 Git 仓库地址、path 依赖或私有 registry
遵循 SemVer 规范:版本号必须符合 Semantic Versioning 2.0.0 规范,详见 3.2.1 版本号规范
版本范围指定:
版本号锁定策略:
Cargo.lock锁定确切版本,确保可复现构建"1.2"),允许补丁更新"=1.2.3"或">=1.2.3, <1.2.4")4.1.2 依赖版本管理
版本更新检查:
依赖更新策略:
cargo update- 更新到兼容的最新版本Cargo.toml中的版本号版本兼容性验证:
依赖审计与健康检查:
注意:建议定期(每月)运行依赖审计命令,确保依赖项的健康和安全。
4.2 依赖声明顺序规范
为避免依赖声明杂乱无章,所有
Cargo.toml应遵循统一的声明顺序:4.2.1 依赖分组规则
4.2.2 依赖声明模板
4.2.3 依赖注释规范
建议为每个依赖添加简短注释说明用途:
4.3 依赖层级控制
4.3.1 最大依赖深度
为避免过深的依赖层级导致维护困难,规定:
依赖深度限制:
依赖深度检查:建议使用
cargo tree --depth 5查看依赖树,详见 4.1.2 依赖版本管理过深依赖的处理:
4.3.2 循环依赖检测与避免
循环依赖的危害:
检测方法:
避免循环依赖的设计原则:
循环依赖解决方案示例:
4.3.3 依赖数量控制
依赖数量建议:
依赖审计:建议使用
cargo audit、cargo +nightly udeps、cargo diet等工具,详见 4.1.2 依赖版本管理减少依赖的策略:
cfg属性减少平台无关代码的依赖4.4 特定架构依赖管理
4.4.1 平台特定依赖
对于只能在特定平台编译的依赖,使用条件编译:
4.4.2 条件依赖
使用 feature 标记控制可选依赖:
4.4.3 裸机目标依赖
对于裸机目标(如
riscv64gc-unknown-none-elf),需要特殊配置:4.4.4 docs.rs 构建配置
确保文档能在 docs.rs 正确构建:
发布前本地验证:
五、组件发布流程
组件发布流程仅针对特殊情况下需要手动发布组件,否则请参考 六、CI/CD 规范 中的要求,统一通过 CI/CD 来进行发布版本!
5.1 发布前检查清单
在发布 crate 到 crates.io 之前,必须完成以下检查:
cargo test --doc)Cargo.toml信息完整5.2 发布流程
发布流程按分支类型分为三种场景:
5.2.1 发布稳定版
适用场景:功能稳定、向后兼容的正式版本
发布分支:main/master 分支
发布流程:
Cargo.toml版本号(PATCH 版本如0.1.2或 MINOR 版本如0.2.0)release: v0.1.2)cargo publish --dry-run检查cargo publish正式发布5.2.2 发布预览版
适用场景:新功能开发、可能包含破坏性变更的版本
发布分支:dev 分支
发布流程:
Cargo.toml版本号为预发布格式(如0.2.0-pre.1)release: v0.2.0-pre.1)cargo publish --dry-run检查cargo publish正式发布5.3 版本回撤
如果发布了错误版本,可以使用
cargo yank撤销:注意:已发布的版本不能删除,只能 yank。yank 的版本仍然可以被已有项目使用,但不会出现在新项目的依赖解析中。
六、CI/CD 规范
为了简化开发人员的工作,我们通过统一的 CI/CD 来自动执行本规范中的各项检查,因此,每个组件仓库必须配置 CI/CD。
我们为 CI/CD 以及本地测试,创建了 https://github.com/arceos-hypervisor/axci 独立仓库,其他组件只需要直接通过
use使用改仓库的 CI/CD 文件即可!6.1 工作流规范
所有组件仓库必须配置以下四个工作流文件。
依赖规则:
deploy.yml和release.yml必须等待check.yml和test.yml全部通过check.yml和test.yml可以并行执行deploy.yml和release.yml可以并行执行(在依赖满足后)6.2 代码质量检查
文件位置:
.github/workflows/check.yml用途:检查代码格式、文档完整性、代码质量等静态检查
触发条件:
push到main、dev分支pull_request到main、dev分支必须包含的检查项:
cargo fmt --all -- --checkcargo clippy --all-targets --all-features -- -D warningscargo build --all-featuresRUSTDOCFLAGS="-D rustdoc::broken_intra_doc_links" cargo doc可选检查项:
RUSTDOCFLAGS="-D missing-docs" cargo doccargo audit环境变量:
配置示例:https://github.com/drivercraft/phytium-mci/blob/main/.github/workflows/check.yml
6.3 测试执行
文件位置:
.github/workflows/test.yml用途:执行单元测试、集成测试,确保功能正确性
触发条件:
push到main、dev分支pull_request到main、dev分支必须包含的测试项:
cargo test --lib --all-featurescargo test --all-featurescargo test --doc可选测试项:
cargo tarpaulin --out Xmlcargo bench平台支持:
x86_64-unknown-linux-gnux86_64-pc-windows-msvc、x86_64-apple-darwin、riscv64gc-unknown-none-elf环境变量:
配置示例:https://github.com/drivercraft/phytium-mci/blob/main/.github/workflows/test.yml
6.4 文档部署
文件位置:
.github/workflows/deploy.yml用途:自动部署组件 API 文档到 GitHub Pages 或其他文档平台
触发条件:
push到main分支check.yml和test.yml全部通过后才执行必须包含的步骤:
依赖检查:
文档生成:
文档部署:
配置示例:https://github.com/drivercraft/phytium-mci/blob/main/.github/workflows/deploy.yml
6.5 自动发布
文件位置:
.github/workflows/release.yml用途:自动发布 GitHub Release 和 crates.io
触发条件:
pushtags(v*)check.yml和test.yml全部通过后才执行必须包含的步骤:
依赖检查:
版本号一致性验证:
Cargo.toml版本是否一致GitHub Release 发布:
crates.io 发布:
cargo publish环境变量:
配置示例:https://github.com/drivercraft/phytium-mci/blob/main/.github/workflows/release.yml
七、维护与更新
7.1 维护列表
当任意 crate 有更新时,应及时更新 AxVisor Crates 维护列表。
7.2 版本维护策略
长期支持版本:建议为重要的稳定版本(如 0.1.x)创建专门的维护分支,接受 bug 修复和安全更新
兼容性保证:
弃用策略:
7.3 安全更新
对于安全漏洞的修复:
八、常见问题与解决方案
8.1 版本冲突
问题:发布时提示版本已存在
原因:
解决方案:
8.2 文档编译失败
问题:docs.rs 编译失败
原因:
解决方案:
8.3 依赖解析失败
问题:下游项目无法解析依赖版本
原因:
解决方案:
8.4 发布失败
问题:
cargo publish失败常见原因和解决方案:
8.5 CI 检查失败
问题:CI 检查失败但本地通过
原因:
解决方案:
8.6 测试失败
问题:测试在 CI 中失败但本地通过
原因:
解决方案:
附录:快速检查清单
A. 提交代码前
必须检查:
cargo fmt格式化代码cargo clippy无警告cargo test测试通过可选检查(根据变更内容):
B. 创建 PR 前
必须检查:
可选检查(根据变更内容):
C. 发布版本前
版本号与元数据:
Cargo.toml信息完整(description、license、repository 等)质量确认:
cargo publish --dry-run成功发布后:
D. 应急处理
严重 Bug 修复:
错误版本撤回:
cargo yank <version>安全漏洞处理:
E. 定期维护(可选)
每月检查:
cargo audit检查安全漏洞cargo outdated检查依赖更新每季度检查:
版本历史
v3.0 (2026-03-02):
v2.0 (2026-01-27):
v1.0 (2026-01-21): 初始版本
本规范由 AxVisor 团队维护,如有疑问或建议,请提交 Issue 或 PR。
最后更新:2026-03-02
Beta Was this translation helpful? Give feedback.
All reactions