从 0 到可下载安装包:用 Rust + Tauri 构建一个 Markdown 图片路径转换器
这次开发几乎是“AI 主写”:我只给出需求描述,后续主要通过多轮对话让 Antigravity 完成代码实现;我负责需求澄清,验收、交互取舍与发布交付。(虽然发布也是我自己 GitHub 建个仓库,让 AI 提交)
最近整理博客内容时遇到一个高频痛点:Markdown 里引用的图片路径常常是本地绝对路径(例如 D:\blog-content\posts\xxx.png),而发布到网站时更希望统一成相对路径(例如 upload/xxx.png)。
目标很明确:做一个桌面小工具,可以选择 .md 文件,预览替换结果,然后一键覆盖或另存为。
最终在不到半小时内,从“只有一个想法”到“能安装、能运行、带 Release 安装包”的桌面应用完成闭环:
- 技术栈:Tauri 2.x + Rust + Web 前端(HTML/CSS/JS)
- 输出:Windows 安装包(
*_setup.exe)+ GitHub Release - 仓库:
markdown-image-path-converter: https://github.com/ruali-dev/markdown-image-path-converter

1. 需求定义
我把需求控制在“最小可用”:
- 选择 Markdown 文件(
.md) - 扫描并识别图片引用路径
- 将图片路径统一改写为
目标前缀/文件名(默认前缀:upload) - 支持预览变更列表
- 支持覆盖原文件或另存为新文件
- UI 简洁,非命令行
2. 创建 Tauri 项目(略)
用 Tauri 官方脚手架创建项目,然后 npm run tauri dev 跑起来即可。这里不展开环境安装细节。

3. 设计:前端 UI + Rust Command
Tauri 的核心模式很清晰:
- 前端做 UI:文件选择、输入前缀、展示预览
- Rust 做能力:读写文件、路径解析、执行替换
- 两者通过
invoke调用命令通信
后端能力拆成四个 command(由 #[tauri::command] 暴露给前端):
read_file(path, fallback_encoding):读取 Markdown 文件内容convert_paths(content, target_prefix):预览转换,返回转换后的内容与变更列表changesconvert_and_save(path, target_prefix):覆盖保存(读 → 转 → 写回)convert_and_save_as(source_path, target_path, target_prefix):另存为(写入目标文件)
前端交互按“先预览、再落盘”设计:
- 点“预览”→ 调
convert_paths→ 渲染changes - 点“覆盖/另存为”→ 调
convert_and_save / convert_and_save_as
小工具的“可信度”主要来自预览区:能看到改了什么,才敢点“覆盖”。
4. 解析规则:只做“够用且可解释”的转换
第一版只处理最常见的 Markdown 图片写法:

策略:
- 对匹配到的图片引用
(path),提取文件名filename - 生成新路径:
{target_prefix}/{filename}(默认upload/xxx.png) - 如果原始路径已经等于新路径,则不计入变更列表;否则记录
old_path -> new_path供预览展示
这一版的目标不是“只处理绝对路径”,而是统一路径风格,保证导出到站点时资源引用结构稳定、可控。
5. 打包构建:生成 exe 与安装包
开发完成后构建发行版:
npm run tauri build
Tauri 通常会产出两类东西:
- 可执行文件(portable):双击就能跑,但不负责安装/卸载
- 安装包(推荐分发):更像“正常软件”,体验更稳(尤其涉及 WebView2)
对外分发我优先发布安装包(*_setup.exe / .msi)。
6. 发布:GitHub Release
仓库地址 : https://github.com/ruali-dev/markdown-image-path-converter
把安装包上传到 GitHub Release,并在 Release Notes 里写清楚:
- Features(功能点)
- System Requirements(Windows 10/11 + WebView2)
- Issues(问题反馈入口)
7. 常见坑(我最在意的)
- 生成的 exe 能跑,但别人机器打不开:Tauri 依赖 WebView2 Runtime。分发优先使用安装包,依赖提示更友好。
- 覆盖原文件有风险:必须保留“另存为”,并建议用户先预览再覆盖。
8. 后续迭代方向
依旧小,但更顺手:
- 支持拖拽
.md到窗口 - 支持批量处理目录下所有
.md - 可选:自动复制图片到
upload/并改写引用(从“改路径”升级到“整理素材”) - 兼容更多写法:
<img src="...">、带 title 的
结语
这次最意外的是:几乎不需要复杂的工程化配置,我只用一句需求 + 几轮对话把边界逐步说清,AI 智能体就能把技术选型、代码骨架、核心逻辑到可运行的桌面应用快速推到位。
说到底,这次我没有把精力花在“怎么写每一行代码”,而是花在“怎么把一个模糊痛点变成一个可靠工具”。
AI 能给你很多“能跑的答案”,但只有你自己能决定“该交付哪一种答案”。