avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 Rust 优化版本
文章

Rust 优化版本

发表于 2026-09-5 更新于 2026-09- 5
作者 mdo
15~20 分钟 阅读

使用 Rust 开发是追求极致小体积、超高性能、零运行时依赖的终极选择。Rust 编译出的二进制文件通常只有 幾百 KB 到 1.5MB 左右,且启动速度是微秒级别的。

为了在 Rust 中保持极小的体积,我们将不使用庞大的重量级框架,而是选用轻量级的 reqwest(配合仅处理 JSON 序列化的最小依赖)。


第一步:初始化 Rust 项目

在终端运行以下命令:

bash

cargo new git-m-cli --bin
cd git-m-cli

请谨慎使用此类代码。

第二步:配置 Cargo.toml (体积优化配置)

为了追求极致的体积,我们需要在 Cargo.toml 中加入编译器优化参数。打开并修改为以下内容:

toml

[package]
name = "git-m-cli"
version = "0.1.0"
edition = "2021"

[dependencies]
# 使用 blocking 模式和 rustls(不依赖系统openssl) 保持轻量
reqwest = { version = "0.12", features = ["blocking", "json", "rustls-tls"], default-features = false }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

# 💡 极致体积优化配置
[profile.release]
opt-level = "z"     # 优化二进制文件大小
lto = true          # 开启全局链接优化
codegen-units = 1   # 减少并行编译单元,进一步减小体积
panic = "abort"     # 发生异常时直接中止,移除异常展开代码
strip = true        # 自动移除所有调试符号表(无需手动 strip)

请谨慎使用此类代码。


第三步:编写核心代码 src/main.rs

将以下代码写入 src/main.rs。代码中直接包含大模型的标准 OpenAI 请求结构,并处理了 Git 暂存区比对与直接提交。

rust

use std::process::{Command, exit};
use serde::{Serialize, Deserialize};

// 配置 API(可以替换为您自己的 API key 和地址)
const API_KEY: &str = "你的_DEEPSEEK_API_KEY"; // 💡 替换为你的 API Key
const BASE_URL: &str = "https://deepseek.com";
const MODEL: &str = "deepseek-chat";

#[derive(Serialize)]
struct Message {
    role: String,
    content: String,
}

#[derive(Serialize)]
struct ChatRequest {
    model: String,
    messages: Vec<Message>,
    temperature: f64,
}

#[derive(Deserialize)]
struct Choice {
    message: ResponseMessage,
}

#[derive(Deserialize)]
struct ResponseMessage {
    content: String,
}

#[derive(Deserialize)]
struct ChatResponse {
    choices: Vec<Choice>,
}

fn main() {
    // 1. 获取 Git 暂存区的 Diff 变更
    let output = Command::new("git")
        .args(["diff", "--cached"])
        .output()
        .unwrap_or_else(|_| {
            eprintln!("❌ 错误: 无法执行 git 命令,请检查是否安装 Git。");
            exit(1);
        });

    if !output.status.success() {
        eprintln!("❌ 错误: 当前目录似乎不是一个 Git 仓库。");
        exit(1);
    }

    let mut diff = String::from_utf8_lossy(&output.stdout).trim().to_string();
    if diff.is_empty() {
        println!("⚠️ 提示: 没有发现已暂存(Staged)的文件,请先运行 `git add` 。");
        exit(0);
    }

    // 限制 Diff 长度,防止超出 Token 限制 (截取前 15000 个字符)
    if diff.len() > 15000 {
        diff.truncate(15000);
    }

    println!("🤖 正在分析暂存区代码并生成备注...");

    // 2. 构造 Prompt
    let prompt = format!(
        "你是一个专业的 Git 提交助手。请根据以下代码的 diff 内容,生成一条精炼、准确、结构清晰的 Git commit message。\n\
         请严格使用 Angular 规范格式(例如: feat(scope): add something 或 fix: resolve bug)。\n\
         不要输出任何解释性文本、不要包裹 markdown 代码块(如 ```),只输出 commit message 本身。\n\n\
         ---\n{}\n---", 
        diff
    );

    // 3. 发送请求给大模型
    let client = reqwest::blocking::Client::builder()
        .build()
        .unwrap_or_else(|e| {
            eprintln!("❌ 初始化网络客户端失败: {}", e);
            exit(1);
        });

    let req_body = ChatRequest {
        model: MODEL.to_string(),
        messages: vec![Message {
            role: "user".to_string(),
            content: prompt,
        }],
        temperature: 0.1,
    };

    let response = client.post(BASE_URL)
        .header("Authorization", format!("Bearer {}", API_KEY))
        .json(&req_body)
        .send();

    let resp = match response {
        Ok(r) => r,
        Err(e) => {
            eprintln!("❌ 请求大模型接口失败: {}", e);
            exit(1);
        }
    };

    if !resp.status().is_success() {
        eprintln!("❌ 接口响应错误 (状态码 {}): {}", resp.status(), resp.text().unwrap_or_default());
        exit(1);
    }

    // 4. 解析结果
    let chat_resp: ChatResponse = resp.json().unwrap_or_else(|e| {
        eprintln!("❌ 解析响应 JSON 失败: {}", e);
        exit(1);
    });

    if chat_resp.choices.is_empty() {
        eprintln!("❌ AI 未能生成有效的备注。");
        exit(1);
    }

    let commit_message = chat_resp.choices[0].message.content.trim().to_string();
    println!("\n📝 AI 建议的备注: {}\n", commit_message);

    // 5. 执行 Git Commit
    println!("🚀 正在提交到 Git...");
    let commit_status = Command::new("git")
        .args(["commit", "-m", &commit_message])
        .status()
        .unwrap_or_else(|_| {
            eprintln!("❌ 执行 git commit 失败。");
            exit(1);
        });

    if commit_status.success() {
        println!("\n✅ 提交成功!");
    } else {
        eprintln!("\n❌ Git 提交未能成功完成。");
        exit(1);
    }
}

请谨慎使用此类代码。


第四步:编译、压缩与体积检查

在项目根目录下,执行 Release 模式编译(Rust 会自动应用我们在 Cargo.toml 中配置的体积压榨参数):

bash

cargo build --release

请谨慎使用此类代码。

编译完成后,你可以在 target/release/ 下找到名为 git-m-cli 的可执行二进制文件。

  • Rust 编译后的大小:通常在 1.2MB - 1.5MB 之间。

  • 无任何运行时依赖:你可以把这个单文件拷到任何同架构的电脑上直接运行。

配合 UPX 进一步压榨(可选)

如果您对体积有极其变态的要求,可以再次使用 upx 进行压缩:

bash

upx --best target/release/git-m-cli

请谨慎使用此类代码。

压缩后,体积会直接暴降到 400KB - 600KB 左右,这几乎是现代 CLI 程序的体积底线。


第五步:注册为 Git 命令

  1. 将编译好的文件更名为 git-m 并移动到系统 PATH 路径中(如 /usr/local/bin):

    bash

    cp target/release/git-m-cli /usr/local/bin/git-m
    

    请谨慎使用此类代码。

  2. 为 Git 配置别名:

    bash

    git config --global alias.m "!git-m"
    

    请谨慎使用此类代码。

大功告成!现在前往任意开发目录,键入 git add . 后输入 git m,即可以 Rust 独有的高并发与微秒级启动性能,秒速完成 AI 提交。

为了让这个 Rust 工具更好地配合您日常开发,您还需要以下哪个改进:

  • 每次提交前,终端出现 [y/n] 让您确认无误后再真正执行 Commit?

  • 支持从系统环境变量或本地 ~/.git-m.toml 动态读取 API Key,而不用硬编码在源码里?

  • 在代码变更过大时,自动缩减/提炼 Diff 文本,防止单次提交超过大模型的上下文窗口限制?

技术
许可协议:  CC BY 4.0
分享

相关文章

10月 2, 2026

iOS 侧载(Sideloading)工具

AltStore 和 Sideloadly 都是目前最流行的 iOS 侧载(Sideloading)工具。 简单来说,它们的作用就是让你绕过苹果的官方 App Store,直接把第三方的 IPA 安装包(也就是 iOS 的应用安装文件)安装到你的 iPhone 或 iPad 上。 通过这两个工具,你

9月 28, 2026

注册 Chat Participant

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。 结合当前 code_ge

9月 23, 2026

php intelephense 设置 if 空格

在 VS Code 中,如果你使用的是 PHP Intelephense 插件,控制 if 关键字后面是否加空格的设置是由其内置的格式化引擎(基于 PSR-12 标准)决定的。 你可以通过修改 VS Code 的 settings.json 来配置这个行为: 1. 开启 if 后面的空格(默认/推荐

下一篇

开发 CLI 工具

上一篇

crewai 扫描项目 形成向量数据库

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。