# personal-toolbox
**Repository Path**: leihenshang/personaltoolbox
## Basic Information
- **Project Name**: personal-toolbox
- **Description**: 工具箱
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-09-22
- **Last Updated**: 2026-09-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# personal-toolbox
基于 [Wails v2](https://wails.io/) 的桌面小工具箱:Go 1.25 后端 + Vue 3 前端,编译为单个原生可执行文件。
> 项目名刻意拼写为 `personal-toolbox`(不是 personal)。它同时出现在 `go.mod` 的 module 名、`wails.json` 的 `name`/`outputfilename`、`main.go` 的 `Title` 和 `frontend/index.html` 的 `
` 四处,修改时需同步。
## 功能
| 功能 | 说明 | 可用平台 |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------ |
| 回收 Docker WSL2 磁盘空间 | 退出 Docker Desktop →`wsl --shutdown` → `diskpart` 压缩 `ext4.vhdx`,回收删除镜像/缓存后 WSL2 未归还的空间 | 仅 Windows(WSL2) |
非 Windows 平台可以正常构建和运行,但空间回收会在环境检查阶段提示不支持。
## 环境要求
### 通用
| 组件 | 版本 | 验证 |
| --------- | -------------------------------------------------------- | ----------------- |
| Go | 1.21+(本项目`go.mod` 声明 1.25.0) | `go version` |
| Node.js | 15+(建议 LTS,实测 v22) | `node -v` |
| npm | 随 Node 附带 | `npm -v` |
| Wails CLI | **v2.15.0**(需与 `go.mod` 中的 wails 版本一致) | `wails version` |
安装 Wails CLI:
```bash
go install github.com/wailsapp/wails/v2/cmd/wails@v2.15.0
```
> 必须把 `$(go env GOPATH)/bin`(Windows 为 `%USERPROFILE%\go\bin`)加入 `PATH`,否则会提示 `wails` 命令不存在。
装完先跑一次自检,它会列出缺失依赖并给出对应发行版的安装命令:
```bash
wails doctor
```
### Windows
- **WebView2 Runtime**:Windows 11 及较新的 Windows 10 已内置;缺失时到 [WebView2 下载页](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) 安装。
- 可选:
- [NSIS](https://nsis.sourceforge.io/) —— 生成 Windows 安装程序(`-nsis`)
- [UPX](https://upx.github.io/) —— 压缩最终二进制(`-upx`)
### macOS
```bash
xcode-select --install
```
- 开发需 macOS 10.15+,发布产物可支持 10.13+
- Apple Silicon(ARM64)需 macOS 11.0+
### Linux
需要 `gcc` 工具链 + `libgtk-3` + `libwebkit2`:
```bash
# Debian / Ubuntu(≤ 23.10)
sudo apt update && sudo apt install -y build-essential libgtk-3-dev libwebkit2gtk-4.0-dev
# Ubuntu 24.04+ / 新版 Debian(仓库里只有 4.1)
sudo apt install -y build-essential libgtk-3-dev libwebkit2gtk-4.1-dev
# Fedora / RHEL
sudo dnf install -y gcc-c++ gtk3-devel webkit2gtk4.1-devel
# Arch / Manjaro
sudo pacman -S --needed base-devel gtk3 webkit2gtk-4.1
```
> 不确定装哪个就先执行 `wails doctor`,它会针对你的发行版给出确切命令。
> 使用 `libwebkit2gtk-4.1-dev` 的发行版,构建时需额外加标签:`wails build -tags webkit2_41`。
## 开发
在项目根目录执行:
```bash
wails dev
```
它会按需安装前端依赖 → 启动 Vite 监听前端改动并热重载 → 编译并拉起桌面窗口。
同时会在 http://localhost:34115 暴露 dev server,用普通浏览器打开即可在 devtools 里直接调用绑定的 Go 方法。
### 只跑前端
```bash
cd frontend
npm install # 首次
npm run dev
```
这种方式没有 Go 后端。`frontend/wailsjs/` 下的绑定文件已生成并提交,前端可独立预览,但调用 Go 方法会失败。
### 新增后端方法
1. 在 `app.go` 的 `App` 结构体上添加**导出方法**(首字母大写);
2. 重新生成绑定:
```bash
wails generate module
```
> `wails dev` / `wails build` 会自动重新生成,一般无需手动执行。`frontend/wailsjs/` 是生成目录,不要手改。
> 小写方法(如 `startup`)会被 Wails 当作生命周期钩子,不会暴露给前端。
## 构建
```bash
# 仓库根目录
wails build
```
`wails build` 会自动执行 `npm install` 与 `npm run build`,再编译 Go 并嵌入前端,产物输出到 `build/bin`。
### 常用参数
| 参数 | 作用 |
| -------------------------- | ----------------------------------------------------------------------------------- |
| `-clean` | 构建前清空`build/bin` |
| `-o ` | 指定输出文件名 |
| `-nsis` | 额外生成 Windows 安装程序(需装 NSIS) |
| `-upx` | 用 UPX 压缩二进制(需装 UPX) |
| `-trimpath` | 去掉二进制中的本地路径信息 |
| `-platform ` | 指定目标平台,逗号分隔多个 |
| `-webview2 <策略>` | Windows 的 WebView2 处理:`download`(默认)/ `embed` / `browser` / `error` |
| `-windowsconsole` | Windows 下保留控制台窗口(调试用) |
| `-debug` / `-devtools` | 调试构建 / 生产构建保留 devtools |
| `-s` | 跳过前端构建(前端无改动时提速) |
| `-m` | 跳过`go mod tidy` |
### Windows(PowerShell / CMD)
```powershell
wails build -clean
wails build -clean -nsis # 同时生成安装包
```
产物:`build/bin/personal-toolbox.exe`;安装包为 `build/bin/personal-toolbox-amd64-installer.exe`。
> `-nsis` 要求本机装有 NSIS 且 `makensis.exe` 在 PATH 中。安装脚本位于 `build/windows/installer/`。
### macOS(Terminal)
```bash
wails build -clean # 当前芯片架构
wails build -clean -platform darwin/universal # amd64 + arm64 通用包
```
产物:`build/bin/personal-toolbox.app`(`.app` 是目录,分发时请整体压缩)。
### Linux
```bash
wails build -clean
wails build -clean -tags webkit2_41 # Ubuntu 24.04+ 等只有 webkit2gtk-4.1 的发行版
```
产物:`build/bin/personal-toolbox`(无扩展名的 ELF 可执行文件)。
### 关于交叉编译
Wails v2 应用依赖 CGO 与各平台原生 WebView,**不支持**直接交叉编译(例如在 macOS 上 `wails build -platform windows/amd64` 会失败)。三种可行做法:
1. **在目标系统上原生构建**(推荐,最稳);
2. 用 CI(如 GitHub Actions)为每个平台起对应系统的 runner 分别构建;
3. 需要单机出全平台产物时使用社区 Docker 方案(如 `wailsapp/xgo`),属实验性质,排错成本高。
## 目录结构
```
.
├── main.go # 入口:窗口配置 + Bind 注册 + 嵌入 frontend/dist
├── app.go # App 结构体与对外暴露的方法
├── docker_wsl.go # Docker WSL2 空间回收实现
├── wails.json # 项目配置(名称、产物名、前后端命令)
├── frontend/
│ ├── src/ # Vue 3 源码(components / assets / style.css)
│ ├── wailsjs/ # 自动生成,勿手改
│ └── dist/ # 前端构建产物,已被 gitignore
└── build/
├── appicon.png # 图标源文件
├── windows/ # 图标、manifest、NSIS 安装脚本
├── darwin/ # Info.plist
└── bin/ # 构建输出(已 gitignore)
```
## 常见问题
**`go build ./...` 报 `pattern all:frontend/dist: no matching files found`**
`frontend/dist` 被 `.gitignore` 忽略,但 `main.go` 的 `//go:embed all:frontend/dist` 依赖它。全新克隆后必须先构建前端,或直接用 `wails build` / `wails dev`(它们会自动跑 `npm install` + `npm run build`)。
**提示 `wails` 命令找不到**
`$(go env GOPATH)/bin` 未加入 `PATH`,添加后重开终端。
**Windows 下 `wails build` 报 `unlinkat ...\personal-toolbox.exe: Access is denied`**
旧的可执行文件正在运行,文件被系统锁定无法覆盖。关闭正在运行的程序后重新构建;或先用 `wails build -o <其他名字>` 输出到新文件名。也可用 `-clean` 前先确认进程已退出。
**Windows 启动白屏或报 WebView2 错误**
缺少 WebView2 Runtime。安装它,或用 `wails build -webview2 embed` 把引导程序打进产物。
**执行空间回收时弹 UAC 窗口**
正常现象,`diskpart` 压缩虚拟磁盘需要管理员权限。程序本身不需要以管理员身份运行:已提权则直接执行,未提权时通过 UAC 临时提权。若 UAC 弹不出来(标准账户或策略禁用),请右键"以管理员身份运行"本程序后重试。
**「回收空间」按钮是灰的**
顶部环境检查未全部通过:需要 Windows + 已安装 Docker Desktop + WSL 可用。三项均满足且扫描到 `.vhdx` 后按钮才可点击。