Rust开发者的Git工作流:从第一次提交到代码审查

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Git工作流是Rust项目的救星(以及你的精神健康)

\n\n

你是否曾经试图回滚一个Rust项目中“损坏”的提交,却意外地影响了src/main.rs、Cargo.toml和另外三个模块?听起来熟悉吗?如果是的话——你绝对不是一个人。Rust以其严谨性著称,但如果没有合理的Git工作流,即使最完美的代码也会变成一团乱麻。

\n\n

在这篇文章中,我将展示如何构建一个Git工作流程,它将为你节省数小时的调试时间和精力。我们将通过真实的Rust示例进行讲解,讨论CI/CD、代码审查,以及如何在同事面前不失颜面。开始吧!

\n\n

Rust的Git工作流基础:从何开始

\n\n

在深入细节之前,让我们先确定基础。对于Rust项目,我建议使用GitHub Flow或Git Flow——具体取决于团队规模。但有一个特点:Rust要求严格的类型检查和测试,因此你的工作流应该针对cargo test和cargo clippy进行优化。

\n\n

Rust的分支结构

\n\n

以下是我在项目中使用的分支最小集合:

\n\n
    \n
  • main — 稳定版本,随时可以发布
  • \n
  • develop — 功能集成分支
  • \n
  • feature/功能名称 — 每个新功能都独立隔离
  • \n
  • hotfix/名称 — 用于紧急修复
  • \n
\n\n

为什么这对Rust很重要?因为cargo check和cargo build可能会发现依赖冲突,而在独立分支中解决这些问题比在公共分支中更容易。

\n\n

示例:为新功能创建功能分支

\n\n

假设你正在用Rust编写一个JSON解析器。你从main分支开始:

\n\n
git checkout main\ngit pull origin main\ngit checkout -b feature/json-parser
\n\n

现在你开始编写代码。以下是你添加到src/parser.rs中的一个简单函数示例:

\n\n
use serde_json::Value;\n\npub fn parse_json(input: &str) -> Result<Value, String> {\n    serde_json::from_str(input).map_err(|e| e.to_string())\n}
\n\n

在提交之前,请务必运行测试:

\n\n
cargo test\ncargo clippy -- -D warnings
\n\n

如果一切正常——进行提交:

\n\n
git add src/parser.rs Cargo.toml\ngit commit -m "feat: 添加带错误处理的基础JSON解析器"
\n\n

请注意提交格式:feat: — 这是Conventional Commits的一部分,它非常适合Rust项目,特别是当你使用自动生成变更日志时。

\n\n

Rust的CI/CD:自动代码检查

\n\n

没有CI,你的Git工作流只是一堆分支。对于Rust,我强烈建议在项目根目录添加一个.github/workflows/ci.yml文件(如果你使用GitHub):

\n\n
name: Rust CI\n\non:\n  push:\n    branches: [ "main", "develop" ]\n  pull_request:\n    branches: [ "main" ]\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v3\n    - name: Build\n      run: cargo build --verbose\n    - name: Run tests\n      run: cargo test --verbose\n    - name: Lint\n      run: cargo clippy -- -D warnings\n    - name: Format check\n      run: cargo fmt -- --check
\n\n

现在,每次推送到main或develop都会触发构建、测试和代码检查。如果CI失败——提交不会被合并。这是防止“在我机器上能运行”的坚不可摧的防线。

\n\n

为什么这能拯救你的项目

\n\n

想象一下:你在添加依赖后忘记更新Cargo.lock。CI会立即发现这一点——cargo build会报错。或者你在生产代码中不小心使用了unwrap()——带有-D warnings标志的clippy会

博客

书籍推荐