本文档介绍如何从零开始构建一个标准化的 rust cli 项目,以 anthropic-config 工具为例。
项目概述
anthropic-config 是一个用于管理 anthropic api 配置的 cli 工具,支持:
- 自定义 api endpoint 配置
- 智谱 ai big model 预设配置
- 查看当前配置
完整构建流程
1. 创建项目结构
# 在工作目录下创建新项目 cargo new anthropic-config cd anthropic-config
生成的标准目录结构:
anthropic-config/
├── cargo.toml # 项目配置文件
└── src/
└── main.rs # 程序入口
2. 配置 cargo.toml
[package] name = "anthropic-config" version = "0.1.0" edition = "2021" description = "cli tool for managing anthropic api configuration" authors = ["your name <your.email@example.com>"] [[bin]] name = "anthropic-config" path = "src/main.rs" [dependencies]
3. 设计模块化架构
将代码按功能拆分为独立模块:
src/ ├── main.rs # 程序入口,命令路由 ├── cli.rs # cli 参数解析和帮助信息 ├── handlers.rs # 各子命令的业务逻辑 ├── env.rs # 环境变量设置和持久化 └── utils.rs # 工具函数(输入读取、字符串处理等)
模块职责划分
main.rs - 入口点
mod cli;
mod env;
mod handlers;
mod utils;
use cli::command;
fn main() {
let cmd = cli::parse_command();
match cmd {
command::custom => handlers::handle_custom(),
command::bigmodel => handlers::handle_big_model(),
command::show => handlers::handle_show(),
command::unknown => cli::print_usage(),
}
}
cli.rs - 命令行解析
use std::env;
pub enum command {
custom,
bigmodel,
show,
unknown,
}
pub fn parse_command() -> command {
let args: vec<string> = env::args().collect();
if args.len() < 2 {
return command::unknown;
}
match args[1].as_str() {
"custom" => command::custom,
"big_model" => command::bigmodel,
"show" => command::show,
_ => command::unknown,
}
}
pub fn print_usage() {
println!("anthropic configuration manager");
println!("usage: anthropic-config <command>");
// ...
}
handlers.rs - 业务逻辑
use crate::env::confirm_and_apply;
use crate::utils::{mask, read_required, read_with_default};
pub fn handle_custom() {
println!("custom anthropic configuration\n");
let base_url = read_required("anthropic_base_url: ");
let token = read_required("anthropic_auth_token: ");
confirm_and_apply(&base_url, &token);
}
pub fn handle_show() {
let base_url = std::env::var("anthropic_base_url")
.unwrap_or_else(|_| "<not set>".to_string());
println!("anthropic_base_url : {}", base_url);
}
env.rs - 环境变量管理
use std::process::command;
use std::fs::openoptions;
use std::io::write;
pub fn confirm_and_apply(base_url: &str, token: &str) {
// 设置当前进程环境变量
std::env::set_var("anthropic_base_url", base_url);
// 持久化到系统
persist_env("anthropic_base_url", base_url);
}
pub fn persist_env(key: &str, value: &str) -> result<(), string> {
if cfg!(target_os = "windows") {
command::new("cmd")
.args(["/c", "setx", key, value])
.status()
.map_err(|e| e.to_string())?;
} else {
// 写入 ~/.bashrc
let home = std::env::var("home")?;
let profile = format!("{}/.bashrc", home);
let mut f = openoptions::new()
.create(true).append(true).open(&profile)?;
writeln!(f, "\nexport {}=\"{}\"", key, value)?;
}
ok(())
}
utils.rs - 工具函数
use std::io::{self, write};
pub fn read_line(prompt: &str) -> string {
print!("{}", prompt);
io::stdout().flush().unwrap();
let mut s = string::new();
io::stdin().read_line(&mut s).unwrap();
s.trim().to_string()
}
pub fn read_required(prompt: &str) -> string {
loop {
let v = read_line(prompt);
if !v.is_empty() {
return v;
}
println!("value required.\n");
}
}
4. 编译和测试
# 开发版本编译(快速,未优化) cargo build # 发布版本编译(优化,体积小) cargo build --release # 运行测试 cargo test # 直接运行 cargo run -- show
5. 安装到系统
方法 1: cargo install(推荐)
# 从本地路径安装 cargo install --path . # 更新时重新安装 cargo install --path . --force
安装位置:
- windows:
%userprofile%\.cargo\bin\anthropic-config.exe - macos/linux:
~/.cargo/bin/anthropic-config
原理:
- 执行
cargo build --release编译 - 复制
target/release/anthropic-config到~/.cargo/bin/ - 该目录已在 path 中,可直接调用
方法 2: 手动复制
# windows copy target\release\anthropic-config.exe c:\windows\system32\ # macos/linux sudo cp target/release/anthropic-config /usr/local/bin/
6. 配置 path
确保 cargo bin 目录在系统 path 中:
windows:
# 添加到系统环境变量 $env:path += ";c:\users\yourname\.cargo\bin" # 或通过 gui 设置 # 系统属性 > 高级 > 环境变量 > path > 新建
macos/linux:
# 添加到 ~/.bashrc 或 ~/.zshrc export path="$home/.cargo/bin:$path" # 重新加载配置 source ~/.bashrc
7. 使用工具
# 查看帮助 anthropic-config # 查看当前配置 anthropic-config show # 自定义配置 anthropic-config custom # 使用智谱 ai big model anthropic-config big_model
开发工作流
日常开发流程
# 1. 修改代码 vim src/main.rs # 2. 快速测试 cargo run -- show # 3. 运行测试 cargo test # 4. 发布新版本 # 更新 cargo.toml 中的版本号 # 重新安装 cargo install --path . --force
项目结构最佳实践
project-name/ ├── .gitignore # git 忽略文件 ├── cargo.toml # 项目配置 ├── cargo.lock # 依赖锁定(自动生成) ├── readme.md # 项目文档 ├── src/ │ ├── main.rs # 入口 │ ├── cli.rs # cli 处理 │ ├── config.rs # 配置管理 │ ├── error.rs # 错误类型 │ └── utils.rs # 工具函数 ├── tests/ # 集成测试 │ └── integration_test.rs └── target/ # 编译输出(.gitignore)
添加依赖
# 命令行参数解析 cargo add clap # 错误处理 cargo add anyhow # 日志 cargo add env_logger
常用命令速查
| 命令 | 说明 |
|---|---|
| cargo new project | 创建新项目 |
| cargo build | 编译(debug) |
| cargo build --release | 编译(release) |
| cargo run | 编译并运行 |
| cargo run -- show | 运行并传参 |
| cargo test | 运行测试 |
| cargo check | 快速检查(不生成二进制) |
| cargo clean | 清理编译产物 |
| cargo install --path . | 安装到系统 |
| cargo update | 更新依赖 |
跨平台编译
windows 编译 linux
rustup target add x86_64-unknown-linux-gnu cargo build --release --target x86_64-unknown-linux-gnu
macos 编译 windows
rustup target add x86_64-pc-windows-gnu cargo build --release --target x86_64-pc-windows-gnu
发布到 crates.io
# 1. 注册账号 cargo login # 2. 检查包名是否可用 cargo search anthropic-config # 3. 发布 cargo publish
故障排查
问题:找不到命令
# 检查 path echo $path # linux/macos echo %path% # windows # 检查安装位置 which anthropic-config # linux/macos where anthropic-config # windows
问题:编译失败
# 清理后重新编译 cargo clean cargo build
问题:权限错误
# linux/macos 确保可执行 chmod +x target/release/anthropic-config
参考资源
总结
构建 rust cli 项目的关键步骤:
- 使用
cargo new创建标准结构 - 按功能拆分模块(cli, handlers, env, utils)
- 使用
cargo build --release优化编译 - 使用
cargo install --path .安装到系统 - 确保
~/.cargo/bin在 path 中
到此这篇关于rust cli 项目构建的实现步骤的文章就介绍到这了,更多相关rust cli 项目构建内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论