news 2026/4/28 2:50:45

使用cargo-generate自定义创建项目模板

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用cargo-generate自定义创建项目模板

1、安装 cargo-generate

cargoinstallcargo-generate

2、创建一个极简空 crate

cargo new my-rocket-template --bin

3、建一个自己的“项目骨架”仓库(只需做一次)

my-rocket-template/ ├── Cargo.toml# 把 rocket 等依赖先写好├── Rocket.toml ├── src/ │ ├── main.rs │ ├── lib.rs │ ├── catchers/ │ ├── models/ │ ├── services/ │ ├── controllers/ │ ├── views/ │ ├── db/ │ ├── utils/ │ └── config/ ├── templates/ ├── static/ └── migrations/

各目录详细解释

目录作用设计理由
models/定义数据结构(User、Post等)与数据库表一一对应,作为“数据载体”
services/实现业务逻辑(CRUD、验证等)控制器不直接操作数据库,保持“瘦控制器”
controllers/处理HTTP请求,调用服务,返回响应只负责“接收请求 → 调用服务 → 返回结果”
views/构造模板渲染所需上下文把复杂数据结构转成模板易用的格式
db/管理数据库连接池统一入口,避免重复建立连接
utils/工具函数、错误类型定义避免重复代码,统一错误处理风格
config/读取配置文件(Rocket.toml + 环境变量)支持本地/测试/生产多环境切换
catchers/处理HTTP错误包含具体的错误处理函数

模板目录结构(templates)

templates/ ├── base.html.tera# 公共布局(导航栏、页脚)├── index.html.tera# 首页├── users/ │ ├── list.html.tera# 用户列表页│ ├── detail.html.tera# 用户详情页│ └── create.html.tera# 创建用户表单页└── posts/ ├── list.html.tera# 帖子列表页├── detail.html.tera# 帖子详情页└── create.html.tera# 创建帖子表单页

静态资源目录(static)

static/ ├── css/ │ └── style.css# 全局样式└── js/ └── main.js# 全局脚本

✅ 静态资源路径在 Rocket.toml 中配置,Rocket 会自动映射为 /static/css/style.css 这类 URL。

数据库迁移目录(migrations)

migrations/ └── 001_initial_schema.sql# 初始建表语句

✅ 使用纯 SQL 文件,方便 DBA 审查;也可接入 sqlx migrate 工具做版本管理。

配置文件(Rocket.toml)

配置块作用
[default]默认配置(端口、模板路径、数据库URL)
[debug]开发环境日志级别
[release]生产环境日志级别
[databases]数据库连接池配置

✅ 支持环境变量覆盖,例如 ROCKET_PORT=8080 cargo run

Cargo.toml源码

[package]name="my-rocket-template"version="0.1.0"edition="2024"[dependencies]# 引入RocketWeb框架,版本0.5.1#Rocket是一个用于Rust的快速、类型安全的Web框架 rocket="0.5.1"

src/controllers/hello.rs

// hello路由处理模块// 该模块包含了处理hello相关路由的函数// 从rocket框架导入get属性宏// get宏用于声明HTTP GET请求的处理函数userocket::get;// 声明index函数为处理根路径(/)的GET请求的处理函数// #[get("/")]属性指定了该函数处理的路径和HTTP方法// pub关键字表示该函数可以被外部模块访问// 返回类型为String,表示返回纯文本响应#[get("/")]pubfnindex()->String{// 返回"Hello, Rocket!"字符串作为响应"Hello, Rocket!".to_string()}// 声明hello_name函数为处理/hello/<name>路径的GET请求的处理函数// <name>是路径参数,会被解析为String类型并传递给函数// pub关键字表示该函数可以被外部模块访问// 返回类型为String,表示返回纯文本响应#[get("/hello/<name>")]pubfnhello_name(name:String)->String{// 使用format!宏将传入的name参数插入到响应字符串中// 返回类似"Hello, Alice!"这样的字符串作为响应format!("Hello, {}!",name)}

src/controllers/mod.rs

// controllers模块的入口文件// 该文件声明了controllers模块下的子模块// 声明hello子模块为公共模块// hello模块包含了处理hello相关路由的函数pubmodhello;

src/catchers/errors.rs

// errors模块// 该模块包含了处理各种HTTP错误的函数// 从rocket框架导入必要的类型和宏// Request: 表示HTTP请求的结构体// catch: 用于声明错误处理函数的属性宏userocket::{Request,catch};// 声明not_found函数为处理404 Not Found错误的函数// #[catch(404)]属性指定了该函数处理的HTTP错误代码// pub关键字表示该函数可以被外部模块访问// 参数req是对Request对象的引用,包含了关于请求的信息// 返回类型为String,表示返回纯文本响应#[catch(404)]pubfnnot_found(req:&Request)->String{// 使用format!宏生成错误消息,包含了未找到的URI// 返回类似"Sorry, '/unknown-path' was not found."这样的字符串作为响应format!("Sorry, '{}' was not found.",req.uri())}

src/catchers/mod.rs

// catchers模块的入口文件// 该文件声明了catchers模块下的子模块// 声明errors子模块为公共模块// errors模块包含了处理各种HTTP错误的函数pubmoderrors;

src/main.rs源码

// 项目主文件入口// 该文件负责启动Rocket Web服务器并配置路由和错误处理// 从rocket框架导入必要的宏和函数// launch: 标记主启动函数的属性宏// routes: 用于声明路由列表的宏// catchers: 用于声明错误处理函数列表的宏userocket::{launch,routes,catchers};// 声明项目内部的controllers模块// controllers模块包含所有处理HTTP请求的路由函数modcontrollers;// 声明项目内部的catchers模块// catchers模块包含所有处理HTTP错误的函数modcatchers;// 从controllers::hello子模块导入具体的路由处理函数// index: 处理根路径(/)的请求// hello_name: 处理/hello/<name>路径的请求usecontrollers::hello::{index,hello_name};// 从catchers::errors子模块导入404错误处理函数// not_found: 处理404 Not Found错误usecatchers::errors::not_found;// #[launch]属性标记该函数为Rocket应用的启动点// Rocket框架会自动调用这个函数来启动服务器#[launch]fnrocket()->_{// 创建并配置Rocket应用实例rocket::build()// 将路由函数挂载到根路径(/)下// 这样,index函数处理http://localhost:8000/// hello_name函数处理http://localhost:8000/hello/<name>.mount("/",routes![index,hello_name])// 注册错误处理函数// 这里注册了404错误处理函数not_found.register("/",catchers![not_found])}

src/lib.rs源码

// 项目库文件入口// 该文件声明了项目的公共模块,允许外部代码访问这些模块// 声明公共的controllers模块// controllers模块包含了所有的路由处理函数pubmodcontrollers;// 声明公共的catchers模块// catchers模块包含了错误处理函数pubmodcatchers;

运行代码

在项目根目录下执行:

cargo run

运行不报错的话,如下:

cargo run Compiling my-rocket-template v0.1.0(/mnt/mydata/myworks/my-rocket-template)Finished`dev`profile[unoptimized + debuginfo]target(s)in11.53s Running`target/debug/my-rocket-template`🔧 Configuredfordebug.>>address:127.0.0.1>>port:8000>>workers:8>>max blocking threads:512>>ident: Rocket>>IP header: X-Real-IP>>limits: bytes=8KiB,>=2MiB,file=1MiB, form=32KiB, json=1MiB, msgpack=1MiB, string=8KiB>>temp dir: /tmp>>http/2:true>>keep-alive: 5s>>tls: disabled>>shutdown: ctrlc=true, force=true, signals=[SIGTERM], grace=2s, mercy=3s>>log level: normal>>cli colors:true📬 Routes:>>(index)GET />>(hello_name)GET /hello/<name>🥅 Catchers:>>(not_found)404📡 Fairings:>>Shield(liftoff, response, singleton)🛡️ Shield:>>X-Frame-Options: SAMEORIGIN>>X-Content-Type-Options: nosniff>>Permissions-Policy: interest-cohort=()🚀 Rocket has launched from http://127.0.0.1:8000

浏览器访问:http://127.0.0.1:8000/显示:Hello, Rocket!
浏览器访问:http://127.0.0.1:8000/hello/任意内容显示:Hello, 任意内容!

在GitHub 创建空仓库(不要勾选任何初始化文件)

1、登录 GitHub → New repository
2、名称填 rocket-web-app(或任意)
3、保持 Public 或 Private 均可,不要选 Add a README / Add .gitignore / Add a license
4、创建后得到地址:
https://github.com/<你的用户名>/rocket-web-app.git

本地项目初始化并提交

cdrocket-web-app# 进入项目根目录gitinit# 生成 .gitgitadd.# 跟踪所有文件(Cargo.toml、src、templates…)gitconfig --global user.name"你的名字"gitconfig --global user.email"你的邮箱"gitcommit -m"Initial commit: Rocket MVC scaffold"

关联远程仓库并推送

gitbranch -M main# 把默认分支命名成 main(GitHub 默认)gitremoteaddorigin https://github.com/<你的用户名>/rocket-web-app.gitgitpush -u origin main# 第一次推送加 -u,以后直接 git push 即可

刷新 GitHub 页面,能看到完整目录结构即成功。

常见小问题速查

现象解决
error: src refspec main does not match anygit commit再 push;或本地分支叫 master,就git branch -M master+git push -u origin master
403 拒绝推送仓库是别人的 / 没权限;或没登录 GitHub CLI,用gh auth login再试
想改 SSH 方式git remote set-url origin git@github.com:<用户名>/rocket-web-app.git

以后新建项目

以后新建项目就用这一行

cargo generate --git https://github.com/nelou100-arch/my-rocket-template.git

输出:

❯ cargo generate --git https://github.com/nelou100-arch/my-rocket-template.git 🤷 Project Name: rocket-web 🔧 Destination: /home/you/文档/myworks/rocket-web... 🔧 project-name: rocket-web... 🔧 Generating template...[1/42]Done: .gitignore[2/42]Done: .history/Cargo_20251216144100.toml[3/42]Done: .history/Cargo_20251216150200.toml[4/42]Done: .history/src/catchers/errors_20251216150434.rs[5/42]Done: .history/src/catchers/errors_20251216150440.rs[6/42]Done: .history/src/catchers/mod_20251216150422.rs[7/42]Done: .history/src/catchers/mod_20251216150427.rs[8/42]Done: .history/src/catchers[9/42]Done: .history/src/controllers/hello_20251216150326.rs[10/42]Done: .history/src/controllers/hello_20251216150332.rs[11/42]Done: .history/src/controllers/mod_20251216150311.rs[12/42]Done: .history/src/controllers/mod_20251216150319.rs[13/42]Done: .history/src/controllers/mod_20251216153144.rs[14/42]Done: .history/src/controllers/mod_20251216153149.rs[15/42]Done: .history/src/controllers[16/42]Done: .history/src/lib_20251216144155.rs[17/42]Done: .history/src/lib_20251216150233.rs[18/42]Done: .history/src/lib_20251216150502.rs[19/42]Done: .history/src/lib_20251216150506.rs[20/42]Done: .history/src/lib_20251216150517.rs[21/42]Done: .history/src/lib_20251216152827.rs[22/42]Done: .history/src/main_20251216144100.rs[23/42]Done: .history/src/main_20251216150224.rs[24/42]Done: .history/src/main_20251216150530.rs[25/42]Done: .history/src/main_20251216150536.rs[26/42]Done: .history/src/main_20251216152514.rs[27/42]Done: .history/src/main_20251216152517.rs[28/42]Done: .history/src/main_20251216152530.rs[29/42]Done: .history/src/main_20251216152714.rs[30/42]Done: .history/src[31/42]Done: .history[32/42]Done: Cargo.lock[33/42]Done: Cargo.toml[34/42]Done: src/catchers/errors.rs[35/42]Done: src/catchers/mod.rs[36/42]Done: src/catchers[37/42]Done: src/controllers/hello.rs[38/42]Done: src/controllers/mod.rs[39/42]Done: src/controllers[40/42]Done: src/lib.rs[41/42]Done: src/main.rs[42/42]Done: src 🔧 Moving generated files into:`/home/you/文档/myworks/rocket-web`... 🔧 Initializing a fresh Git repository ✨ Done!New project created /home/you/文档/myworks/rocket-web
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 12:39:27

掌握这3种模式,轻松实现Docker Offload与Kubernetes云资源联动

第一章&#xff1a;Docker Offload 的云端资源对接 在现代云原生架构中&#xff0c;Docker Offload 技术被广泛用于将容器化工作负载从本地环境无缝迁移至云端资源。该机制通过标准化接口实现与主流云平台&#xff08;如 AWS、Azure 和 Google Cloud&#xff09;的高效集成&…

作者头像 李华
网站建设 2026/4/26 17:46:30

一文详解Verilog中命名块有什么用?

🧩 一、块名是什么 在 Verilog 中,begin : block_name ... end(或 fork : block_name ... join) 称为一个 命名块(named block)。 例子: always @(posedge clk) begin : u1reg [3:0] counter;counter <= counter + 1; end : u1这里 u1 就是块名(block name)。 …

作者头像 李华
网站建设 2026/4/23 16:27:39

【稀缺技术曝光】:实现R与Python无缝可视化的7个关键步骤

第一章&#xff1a;R与Python可视化集成的背景与意义在数据科学领域&#xff0c;R 和 Python 各自拥有强大的可视化生态系统。R 语言凭借 ggplot2、lattice 等包&#xff0c;在统计图形表达方面具有深厚积累&#xff1b;而 Python 则依托 matplotlib、seaborn 和 plotly&#x…

作者头像 李华
网站建设 2026/4/18 15:06:04

Tesseract在Dify中的性能瓶颈在哪?3步完成识别加速优化

第一章&#xff1a;Dify Tesseract 的识别速度在处理大量图像文本识别任务时&#xff0c;Dify 与 Tesseract 结合的方案展现出卓越的性能表现。该组合通过优化图像预处理流程和并行调用 OCR 引擎&#xff0c;显著提升了整体识别吞吐量。提升识别效率的关键策略 使用多线程并发处…

作者头像 李华
网站建设 2026/4/23 17:42:02

50、sendmail 配置与使用全解析

sendmail 配置与使用全解析 1. 编译 sendmail sendmail 的源代码可通过匿名 FTP 从 ftp.sendmail.org 的 pub/sendmail 目录获取。在该目录下,会有信息提示最新版本的 sendmail。以下以 sendmail V8.8.5 为例进行说明。在安装新软件前,务必阅读随附的 README 文件和安装…

作者头像 李华