200字
从 0 到可下载安装包:用 Rust + Tauri 构建一个 Markdown 图片路径转换器
2026-01-31
2026-02-03

从 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

main.webp


1. 需求定义

我把需求控制在“最小可用”:

  1. 选择 Markdown 文件(.md
  2. 扫描并识别图片引用路径
  3. 将图片路径统一改写为 目标前缀/文件名(默认前缀:upload
  4. 支持预览变更列表
  5. 支持覆盖原文件另存为新文件
  6. UI 简洁,非命令行

2. 创建 Tauri 项目(略)

用 Tauri 官方脚手架创建项目,然后 npm run tauri dev 跑起来即可。这里不展开环境安装细节。

antigravity截图.webp

3. 设计:前端 UI + Rust Command

Tauri 的核心模式很清晰:

  • 前端做 UI:文件选择、输入前缀、展示预览
  • Rust 做能力:读写文件、路径解析、执行替换
  • 两者通过 invoke 调用命令通信

后端能力拆成四个 command(由 #[tauri::command] 暴露给前端):

  • read_file(path, fallback_encoding):读取 Markdown 文件内容
  • convert_paths(content, target_prefix):预览转换,返回转换后的内容与变更列表 changes
  • convert_and_save(path, target_prefix):覆盖保存(读 → 转 → 写回)
  • convert_and_save_as(source_path, target_path, target_prefix):另存为(写入目标文件)

前端交互按“先预览、再落盘”设计:

  1. 点“预览”→ 调 convert_paths → 渲染 changes
  2. 点“覆盖/另存为”→ 调 convert_and_save / convert_and_save_as

小工具的“可信度”主要来自预览区:能看到改了什么,才敢点“覆盖”。


4. 解析规则:只做“够用且可解释”的转换

第一版只处理最常见的 Markdown 图片写法:

  • ![](path)
  • ![alt](path)

策略:

  • 对匹配到的图片引用 (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. 后续迭代方向

依旧小,但更顺手:

  1. 支持拖拽 .md 到窗口
  2. 支持批量处理目录下所有 .md
  3. 可选:自动复制图片到 upload/ 并改写引用(从“改路径”升级到“整理素材”)
  4. 兼容更多写法:<img src="...">、带 title 的 ![](... "title")

结语

这次最意外的是:几乎不需要复杂的工程化配置,我只用一句需求 + 几轮对话把边界逐步说清,AI 智能体就能把技术选型、代码骨架、核心逻辑到可运行的桌面应用快速推到位。

说到底,这次我没有把精力花在“怎么写每一行代码”,而是花在“怎么把一个模糊痛点变成一个可靠工具”。

AI 能给你很多“能跑的答案”,但只有你自己能决定“该交付哪一种答案”。

从 0 到可下载安装包:用 Rust + Tauri 构建一个 Markdown 图片路径转换器
作者
若离
发表于
2026-01-31
License
CC BY-NC-SA 4.0

评论