Clash Verge 开发者文档
面向 Clash Verge 源码构建、二次开发与项目贡献,说明 Tauri 2 + Rust + React 的客户端架构、 本地开发与打包流程、前后端通信、Mihomo 外部控制 API,以及提交代码前需要完成的检查。
Clash Verge 项目架构
Clash Verge 是基于 Tauri 2 的桌面客户端。React + TypeScript 负责图形界面,Rust 与 Tauri 负责桌面应用和系统集成, Mihomo(Clash Meta)负责规则匹配、DNS 与流量转发。开发时先区分客户端逻辑与内核逻辑,可以更快定位问题。
| 层 | 技术 | 负责什么 |
|---|---|---|
| 界面层 | React + TypeScript + Vite | 订阅、节点、规则、连接与日志的可视化操作 |
| 应用层 | Tauri 2 + Rust | 窗口与托盘、内核进程管理、系统代理与 TUN、配置读写、自动更新 |
| 内核层 | Mihomo(Clash Meta) | 协议实现、规则匹配、DNS、流量转发,并对外提供 RESTful API |
说明 Clash Verge 的图形界面负责呈现与交互,客户端通过 Tauri/Rust 与系统能力连接,并通过 Mihomo API 读取或修改内核运行状态。 遇到问题时,应先判断它属于前端界面、桌面应用层,还是 Mihomo 内核层。
Clash Verge 开发环境
本地开发需要 Rust、Node.js、Corepack/pnpm,以及当前操作系统对应的 Tauri 构建依赖。不同平台的准备项并不完全相同。
| 系统 | 需要安装 | 备注 |
|---|---|---|
| 通用 | Node.js、Corepack/pnpm、Rust 工具链 | 先执行 corepack enable,并确认 node、pnpm 与 cargo 可用 |
| Windows | MSVC Rust 工具链、GNU patch;Windows ARM 还需要 LLVM/clang | 确保 Rust 与 Node.js 已加入 PATH;Windows ARM 构建需满足 clang 依赖 |
| macOS | Xcode Command Line Tools | xcode-select --install |
| Linux | WebKitGTK 4.1、Ayatana AppIndicator、librsvg、patchelf 等开发包 | 包名按发行版不同,参照 Tauri 官方的依赖清单 |
注意 Linux 依赖名称会随发行版变化;当前贡献文档以 Ubuntu 为例列出 WebKitGTK、Ayatana AppIndicator、librsvg 与 patchelf。 Windows ARM 还需要 LLVM/clang。具体依赖始终以仓库最新 CONTRIBUTING.md 为准。
Clash Verge 本地开发与构建
开发流程从克隆仓库、安装依赖开始,再通过 prebuild 准备 Mihomo 内核与服务资源,最后进入开发模式或生成当前平台的安装包。
-
克隆仓库
拿到源码并进入项目目录。
-
安装前端依赖
仓库使用 pnpm 管理依赖,混用别的包管理器容易导致锁文件冲突。
-
准备 Mihomo 与运行时资源
执行项目的 prebuild 脚本,下载当前平台所需的 Mihomo 内核与 service/sidecar 资源。
-
启动开发模式
pnpm dev用于标准开发流程;需要直接运行 Tauri 开发模式时也可使用仓库提供的pnpm dev:tauri。 -
打包安装包
pnpm build生成正式构建;需要更快的测试构建时可使用项目提供的pnpm build:fast。
# 1. 克隆仓库
git clone https://github.com/clash-verge-rev/clash-verge-rev.git
cd clash-verge-rev
# 2. 启用包管理器并安装依赖
corepack enable
pnpm install
# 3. 下载 Mihomo 内核与运行时资源
pnpm run prebuild
# 需要重新下载时:
# pnpm run prebuild --force
# 4. 启动 Clash Verge 开发环境
pnpm dev
# 可选:pnpm dev:tauri
# 5. 构建当前平台
pnpm build
# 快速测试构建:pnpm build:fast
说明
当前仓库使用 pnpm 管理前端依赖,开发前应先执行 pnpm run prebuild 准备内核与服务资源。
命令名称和参数以后仍可能调整,因此应同时核对 package.json 与 CONTRIBUTING.md。
Clash Verge 源码目录
源码主要分为前端、Tauri/Rust 应用层与构建脚本。修改界面通常从 src/ 开始,桌面应用与系统集成则重点查看 src-tauri/。
clash-verge-rev/
├─ src/ # React + TypeScript 前端
├─ src-tauri/ # Tauri 2 + Rust 桌面应用层
│ ├─ src/ # Rust 业务与系统集成代码
│ ├─ resources/ # 应用运行资源
│ ├─ sidecar/ # Mihomo 等外部二进制资源
│ ├─ Cargo.toml # Rust 依赖
│ └─ tauri.conf.json # Tauri 构建、应用标识与打包配置
├─ scripts/ # prebuild、版本与发布辅助脚本
├─ .github/ # CI / GitHub Actions
├─ package.json # 前端依赖与 pnpm scripts
├─ CONTRIBUTING.md # 官方贡献与开发环境说明
└─ UPDATELOG.md # 版本更新记录
说明 目录结构会随开发分支调整,上表用于建立代码层级认知。实际修改前应直接查看当前仓库; 涉及界面文案时还应同步项目的国际化资源,并运行相应的格式与检查命令。
Tauri 前后端通信
Clash Verge 前端通过 Tauri API 与 Rust 应用层通信。需要读取系统状态、修改本地配置或调用桌面能力时,
通常通过 invoke 进入 Rust 命令;持续状态变化则可以通过事件监听接收。
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
// 调用 Rust 侧已经注册的 Tauri 命令
const result = await invoke("command_name", {
payload: { key: "value" },
});
// 监听 Rust 侧事件
const unlisten = await listen("event-name", (event) => {
console.log(event.payload);
});
// 页面或组件卸载时取消监听
unlisten();
// 示意:Rust 侧通过 #[tauri::command] 暴露命令
#[tauri::command]
fn command_name(payload: serde_json::Value) -> Result<serde_json::Value, String> {
Ok(payload)
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![command_name])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
注意
上面的代码只说明 Tauri invoke / event 的通信模型,不代表 Clash Verge 当前实际命令名。
开发具体功能时,应从前端调用位置追踪到 src-tauri 中真实注册的命令和事件。
Mihomo 外部控制 API
Mihomo 可通过 external-controller 暴露 RESTful API。配置 secret 后,
请求需要携带 Bearer 鉴权;代理组、配置、连接、日志与实时流量等运行状态都可以通过这套接口读取或控制。
# 示例地址:请替换为 Clash Verge 当前实际的 external-controller
BASE=http://127.0.0.1:9090
AUTH="Authorization: Bearer 你的-secret"
# 读取 Mihomo 版本与当前配置
curl -H "$AUTH" "$BASE/version"
curl -H "$AUTH" "$BASE/configs"
# 修改运行模式:rule / global / direct
curl -X PATCH -H "$AUTH" -d '{"mode":"rule"}' "$BASE/configs"
# 查看代理与策略组
curl -H "$AUTH" "$BASE/proxies"
# 查看活动连接
curl -H "$AUTH" "$BASE/connections"
# 实时流量与日志可使用 GET / WebSocket
# ws://127.0.0.1:9090/traffic?token=你的-secret
# ws://127.0.0.1:9090/logs?level=info&token=你的-secret
| 接口 | 方法 | 用途 |
|---|---|---|
/version |
GET | 内核版本,常用来探测 API 是否可用 |
/configs |
GET / PATCH / PUT | 读取配置、局部修改(模式、端口),或整体重载配置文件 |
/proxies |
GET | 列出全部节点与策略组及当前选择 |
/proxies/{name} |
GET / PUT | 查看单个节点信息,或为策略组切换节点 |
/proxies/{name}/delay |
GET | 指定测速地址与超时,返回延迟 |
/rules |
GET | 当前生效的规则列表,用于确认规则是否按预期加载 |
/connections |
GET / DELETE | 活动连接列表,或断开指定连接 |
/traffic、/logs |
WebSocket | 实时上下行流量与日志流 |
注意
示例中的端口只是 Mihomo API 演示值,Clash Verge 实际运行端口应以当前配置为准。
external-controller 具有较高控制权限,开发调试时应优先监听本机,并为 API 设置可靠的 secret。
Clash Verge 数据与调试目录
Clash Verge 的客户端配置、订阅数据、生成配置与日志保存在本机。调试配置加载、升级迁移或启动问题时,数据目录和日志目录通常是第一排查入口。
| 系统 | 大致位置 | 里面有什么 |
|---|---|---|
| Windows | %APPDATA%\<应用标识>\ |
客户端设置、订阅与生成配置、扩展配置/脚本、Mihomo 与应用日志 |
| macOS | ~/Library/Application Support/<应用标识>/ |
|
| Linux | ~/.local/share/<应用标识>/ |
说明
当前 Tauri 配置中的应用标识可在 src-tauri/tauri.conf.json 查看,但实际数据路径仍可能因平台和构建渠道不同而变化。
调试时优先使用客户端提供的应用目录/日志目录入口定位文件,修改前先备份。
Clash Verge 贡献流程
参与 Clash Verge 开发时,应先阅读 CONTRIBUTING.md,保持改动范围明确,并在提交 PR 前完成前端与 Rust 侧的检查、格式化和本地验证。
-
先确认贡献范围
较大的功能或行为修改先通过 Issue / Discussion 对齐问题与方案;修复已有明确问题时也应引用对应上下文。
-
Fork 并新建分支
一个分支只做一件事,分支名能说明意图,例如
fix/tray-menu-crash。 -
运行代码检查与本地验证
前端运行
pnpm lint,Rust 侧运行cargo clippy-all,并用cargo fmt/pnpm format保持格式一致。 -
使用签名提交
官方贡献说明要求提交进行签名验证;同时保持提交信息清晰,一条提交尽量对应一个独立改动点。
-
提交 PR 并附验证说明
PR 中写清系统环境、修改范围与验证结果;涉及界面变化时附截图,涉及行为变化时说明复现步骤与测试方式。
注意 项目采用 GPL-3.0,提交代码意味着以同样协议授权。涉及新增依赖时请在 PR 里说明必要性与协议兼容性。
Clash Verge 构建与发布
Clash Verge 的正式安装包通过 GitHub Actions/CI 构建并发布到 Releases。开发分支还存在自动构建流程,而 Mihomo Alpha 内核切换属于另一层运行时能力,两者不要混为一谈。
| 渠道 | 适合谁 | 说明 |
|---|---|---|
| 正式 Releases | 发布与日常使用 | 按版本号发布安装包,变更内容查看 Releases 与 UPDATELOG.md |
| AutoBuild / 开发构建 | 测试最新提交 | 面向开发验证,更新频率更高,不应与 Mihomo Alpha 内核通道混淆 |
| 自行构建 | 开发与定制 | 产物未签名,系统会有安全提示,不建议作为长期使用方式分发给他人 |
说明 对外分发时应以项目 GitHub Releases 为正式发行来源;自行构建版本需要明确标识来源。 Mihomo 稳定/Alpha 内核切换是客户端内核选择能力,不等同于 Clash Verge 应用版本的发布渠道。
Clash Verge 构建排错
Clash Verge 本地构建失败通常集中在依赖、系统工具链、prebuild 资源或平台运行时。先按下面的现象定位,再去仓库 Issues 搜索同类问题。
| 现象 | 常见原因 | 怎么处理 |
|---|---|---|
| 依赖安装报锁文件错误 | 用了 npm 或 yarn 安装 | 统一用 pnpm;删掉 node_modules 后重新 pnpm i |
| 开发模式启动即退出 | 未准备 Mihomo / service 等运行时资源 | 先执行 pnpm run prebuild;需要重新下载时加 --force |
| Rust 编译提示找不到链接器 | 缺少平台构建工具(MSVC / CLT) | 补齐系统构建工具后重开终端再编译 |
| Linux 上报缺少某个库 | WebKitGTK 等开发包未安装 | 按报错里的库名安装对应 -dev 包 |
| 下载内核资源超时 | 网络无法访问发布地址 | 配好终端代理再重试,或手动放置资源后重跑 |
| 打包成功但启动白屏 | 前端资源未正确构建,或 WebView2 缺失 | 先确认前端构建产物存在;Windows 上补装 WebView2 运行时 |
| 改了界面文案但语言切换后丢失 | 只改了一种语言的词条 | 同步更新 src/locales/ 下所有语言文件 |
Clash Verge 开发资源
开发命令、实现细节与版本行为应优先回到 Clash Verge 官方仓库、Releases、Issues 与当前源码确认。