ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Comprehensive Rust 课程仓库的贡献工作流:构建验证、习题机制、测试与格式化全解析

Comprehensive Rust 课程仓库的贡献工作流:构建验证、习题机制、测试与格式化全解析 Comprehensive Rust 课程仓库的贡献工作流构建验证、习题机制、测试与格式化全解析【免费下载链接】comprehensive-rustThis is the Rust course used by the Android team at Google. It provides you the material to quickly teach Rust.项目地址: https://gitcode.com/GitHub_Trending/co/comprehensive-rust本文基于 Comprehensive RustGoogle Android 团队开发的 Rust 多日课程仓库的 CONTRIBUTING.md 展开系统讲解向该课程仓库提交代码的完整工程流程如何构建并验证书籍、按 ANCHOR 锚点机制编写配套习题、跑通三层测试体系以及用 dprint 驱动的多语言格式化工具链。读完本文你可以独立完成课程内容的修改、习题的新增并确保提交符合 CI 的构建、测试与格式检查要求。一、提交前的构建验证三件事必须通过贡献指南开宗明义在提交补丁之前必须确保以下三件事在你的本地环境全部通过mdbook build能成功构建书籍mdbook serve能正常启动本地服务dprint fmt能完成代码格式化即格式化后无意外差异。这三项验证依赖一套项目专用的工具链。仓库要求先用 xtask 任务工具 安装依赖cargo xtask install-tools安装方式详见 README 的 Setup 章节。从源码看xtask/src/main.rs 中的install_tools函数做了远多于“装几个工具”的事情这也是它能保证贡献者与 CI 环境一致的原因固定 Rust 夜间工具链调用rustup toolchain install --profile minimal nightly-2025-09-01并为其添加rustfmt组件xtask/src/main.rs。这里 pin 住nightly-2025-09-01是因为 rustfmt.toml 启用了 nightly 专属的unstable_features工具链版本漂移会导致本地与 CI 的格式化结果不一致。cargo 安装的第三方工具以--locked标志安装mdbook 0.5.3与i18n-report 0.2.0xtask/src/main.rs。源码注释明确说明--locked对可复现构建很重要。Bazel 构建的项目工具一次性bazel build七个目标——本地的mdbook-course、mdbook-exerciser以及外部插件mdbook-gettext、mdbook-xgettext、mdbook-pandoc、mdbook-svgbob、mdbook-linkcheck2xtask/src/main.rs。落盘方式Bazel 编译产物被复制到~/.cargo/bin/读取CARGO_HOME环境变量缺省为~/.cargo/bin效果等同于cargo installxtask/src/main.rs。清理动作安装结束前会执行cargo uninstall mdbook-linkcheck移除与新版mdbook-linkcheck2冲突的旧插件xtask/src/main.rs。此外cargo xtask还提供其他任务例如cargo xtask serve在 http://localhost:3000 启动课程网页服务cargo xtask build生成静态课程到book/目录两者均支持--language/-l参数ISO 639 语言代码构建对应翻译版本xtask/src/main.rs。二、编写习题Writing ExercisesANCHOR 锚点机制课程每一段segment的结尾都配有一道习题。CONTRIBUTING.md 定义了习题的标准工程结构这是整个课程仓库最有特色的机制exercise.rs是唯一的事实源。题面与答案都写在这一个文件里用// ANCHOR: name与// ANCHOR_END: name注释切分出代码块。exercise.md与solution.md通过 include 指令引用锚点。语法为{{#include exercise.rs:anchor_name}}分别只暴露题目部分或解答部分。每个 segment 有一个Cargo.toml其中包含指向exercise.rs的[[bin]]或[lib]段该包再被根 Cargo.toml 的 workspacemembers引用最终效果是cargo test会直接构建并测试exercise.rs。以 Collatz 序列习题为例可以看到完整链路锚点定义在 src/control-flow-basics/exercise.rsANCHOR: solution内嵌ANCHOR: collatz_length函数签名与空实现和ANCHOR: main演示代码题面 src/control-flow-basics/exercise.md 用两个 include 指令只取出题目相关部分并保留了todo!(Implement this)占位可执行目标定义在 src/control-flow-basics/Cargo.toml[[bin]] name collatz、path exercise.rs根 Cargo.toml 的members列表中登记了src/control-flow-basics等二十余个习题包保持排序文件内有 “keep the workspace members sorted” 注释。CONTRIBUTING.md 还给出两条习题设计准则第 1 天的习题应使用fn main() { .. }配合dbg!或println!由学生肉眼验证输出第 2 天起优先使用测试、省略fn main()。但测试难以表达而视觉验证更自然的场景如 Logger 习题仍允许用fn main()。隐藏测试技巧对于没有测试的习题建议在exercise.rs中补充那些不出现在exercise.md或solution.md任何锚点里的测试——它们不参与题面展示却能防止答案写错。这正利用了 ANCHOR 机制“锚点之外内容对读者不可见”的特性。三、三层测试体系课程材料通过三种方式测试提交前建议全部跑一遍命令作用源码依据mdbook test测试书籍内嵌代码样例。部分样例在 Markdown 中标记为ignore因为 Playground 缺少课程用到的部分 cratextask 的rust-tests任务实际就是在工作区根目录执行mdbook test见 xtask/src/main.rscargo test构建并测试工具链代码以及 Playground 中无法测试的代码样例即上文习题包与mdbook-course、mdbook-exerciser等工具根 workspace 见 Cargo.tomlnpm test测试渲染出的网页功能详见 tests/README.mdxtask 的web-tests任务在tests/目录执行npm test见 xtask/src/main.rsweb 测试值得展开根据 tests/README.md项目使用 webdriverIO Expect API Mocha用真实浏览器访问页面并断言页面状态主要守护theme/speaker-notes.js、theme/book.js这类可能损坏的自定义 JS。CI 中通过 Static Server Service 在localhost:8080提供书籍本地开发则推荐cargo xtask serve默认 3000 端口配合npm run test-mdbook。仓库也提供了从任意位置触发 web 测试的入口cargo xtask web-tests。一个实现细节可以佐证测试对“内容完整性”的敏感度create_slide_list函数会把待检查的幻灯片清单写成tests/src/slides/slides.list.ts供 JS 测试消费——在 CI 环境中它只通过git diff检查本次 PR 修改过的src/*.md对应的页面本地环境则检查全部页面并排除exercise.html、solution.html、toc.html等不参与风格检查的页面xtask/src/main.rs。tests/README.md 还区分了两类失败属于真实问题的如页面过长需要缩短或申请豁免必须在合并前修复而类似WebDriverError: tab crashed的环境性故障应提 bug 报告其他检查通过时可以覆盖 web-test 要求合并。四、格式化dprint 驱动的多语言工具链贡献指南要求所有文件格式一致工具组合为dprint总驱动rustfmt格式化 Rust 代码yapf格式化 Python 代码msgcat格式化 PO 翻译文件仓库po/目录下有二十余种语言的翻译文件。统一入口是一条命令dprint fmt。从 dprint.json 可以看到它如何把各语言工具“拼装”起来全局lineWidth: 80Markdown 插件设置textWrap: always即所有 Markdown 一律折行为 80 列——这就是贡献指南要求跑dprint fmt才能保证文档排版一致的原因exec段把非 Rust 语言委托给外部命令.py文件交给yapf3.rs文件交给rustup run nightly-2025-09-01 rustfmt --edition 2024。注意这里直接通过rustup调用指定夜间工具链的 rustfmt与install-tools安装的工具链版本严格对应excludes排除了/book/构建产物、/theme/*.hbs与/theme/book.js、/third_party/、target/插件集包括 exec、json、markdown、toml 与 prettier分别覆盖 shell 命令代理、JSON如 tests/tsconfig.json、Markdown全部课程内容与 TOML各Cargo.toml、book.toml文件。配套的 rustfmt.toml 同样关键启用unstable_features因此必须 nightly、imports_granularity Module、wrap_comments true并将max_width设为 85、use_small_heuristics Max。文件内注释解释了 85 这个取值的动机“代码块超过这个宽度就会出现滚动条”即 85 列是课程页面代码块的无滚动条宽度上限。这也意味着贡献者本地 rustfmt 版本不对时提交的 Rust 代码可能与 CI 的格式化结果冲突——所以指南特别强调运行cargo xtask install-tools安装 pinned 的 nightly 工具链并添加rustfmt组件使本地格式化与 CI 完全一致。五、各平台工具安装CONTRIBUTING.md 按平台给出了依赖安装方式以下如实整理Linux按官方说明安装dprint通过rustup安装rustfmt通过 Bazelisk 版本管理器安装 Bazel安装 pandoc 3.7.0.1Debian 系可以用 apt 安装其余工具sudo apt install yapf3 gettext texlive texlive-luatex texlive-lang-cjk texlive-lang-arabic librsvg2-bin fonts-nototexlive 相关组件对应 book.toml 中的 PDF 输出配置[output.pandoc.profile.pdf]使用lualatex引擎与 Noto 字体族支持 CJK/阿拉伯语回退字体。MacOS在 Homebrew 下brew install dprint yapf gettext bazeliskWindows安装 Gettext for Windows 工具集按官方说明安装dprint通过rustup安装rustfmt通过 Bazelisk 安装 Bazel文档中yapf在 Windows 下的安装方式仍标注为 TODO尚未补充。README 另提醒Windows 用户需启用符号链接git config --global core.symlinks true并开启开发者模式。六、CLA、代码审查与社区规范贡献流程的剩余部分较为常规此处如实说明贡献者许可协议CLA所有贡献必须附带 CLA版权仍归贡献者或其雇主CLA 只是授予项目使用与再分发贡献的权限。指南提示通常只需签署一次之前为其他项目签过的 Google CLA 一般无需重签。代码审查所有提交包括项目成员自己的提交都必须经过审查项目使用 GitHub Pull Request 作为审查渠道。社区准则项目遵循 Google 开源社区行为准则。七、小结一次合格的贡献应满足什么综合 CONTRIBUTING.md 与仓库实现一次可合并的提交需要同时满足mdbook build与mdbook serve在本地成功书籍内容与预处理管线——gettext、svgbob、course 预处理见 book.toml——全部正常若新增/修改习题遵循exercise.rs ANCHOR 锚点 [[bin]]/[lib] workspace 登记的完整结构并按“第 1 天用main验证、其后优先测试”的原则设计题面mdbook test、cargo test、npm test或cargo xtask web-tests三层测试通过dprint fmt无差异且本地 rustfmt 来自cargo xtask install-tools安装的nightly-2025-09-01工具链已签署 CLA并通过 Pull Request 完成审查。这套流程的底层逻辑是课程内容本身就是“可执行、可测试、可构建”的工程资产——习题即代码样例文档即测试对象格式即接口契约。理解 xtask 任务、dprint 配置 与 习题锚点结构这三处实现就能准确把握 CONTRIBUTING.md 中每一条规则背后的工程原因。【免费下载链接】comprehensive-rustThis is the Rust course used by the Android team at Google. It provides you the material to quickly teach Rust.项目地址: https://gitcode.com/GitHub_Trending/co/comprehensive-rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表