# 卸载 [← 回到 README](../README.md) ## 三种状态的区别 | 操作 | 插件文件 | 工具 / 技能 | Python 环境 | | --- | --- | --- | --- | | **禁用** | 保留 | 停用 | **保留** | | **关闭 DSH / 重启** | 保留 | 随宿主 | **保留** | | **卸载** | 移除 | 移除 | **按登记记录清理** | **只有真正的卸载会触发清理。** 禁用、关闭、重启都不会,也不会留下任何常驻进程。 ## 怎么判定「真的被卸载了」 卸载和「普通的宿主退出」在插件看来长得一样 —— 重载 profile、退出 DSH 都会 dispose 插件。 所以插件分两步判断: 1. **`stillSelectedInProfile()`** —— 读 profile 的 `dsh.profile.bundles`。 只要还有 profile 把本插件列在它的 bundles 里,就认为**不是**卸载,直接返回,什么都不做。 2. **调度看门狗** —— 确认 profile 已经不再引用本插件之后,才派发一个脱离宿主的清理进程。 这样设计是为了区分两种情形:**真的被移除**(包目录没了、profile 也不再引用), 以及**包目录还在、但 profile 丢掉了引用**(此时按「已分离」处理,仍然走清理)。 配置项 `removeEnvOnUninstall` 设为 `false` 可以整体关掉这个行为。 ## 看门狗进程 看门狗是一个独立的短生命周期进程,它: - 用**单实例锁**保证同一时间最多只有一个看门狗在跑; - 自己有时限预算(`timeoutSec`,默认 **120 秒**),超时就以失败收场而不是无限等待; - 结束后把日志压缩成**一行摘要**,并删掉自己创建的文件(锁、脚本本身)。 日志被压缩成一行是刻意的:避免在 DSH 数据目录里堆积长文本。 ## 清理范围 严格限定在**插件自己的环境记录**(DSH 数据目录里的 `*.env.json`)中登记过的包: - **会清理**:只有插件自己 `pip install` 进来、并且记在环境记录里的包。 - **不会碰**:DSH 运行时自带的包、被其它组件依赖的包、**你自己装的包**。 - **没有环境记录时**:直接以「无需清理」结束,什么都不删。 清理完成后环境记录本身也会被移除,留下那行摘要日志。 ## 恢复被清理的环境 清理是不可逆的 —— 但重新装回来很容易: 1. 重新安装插件(见 [安装文档](installation.md))。 2. 打开 **设置 → Office 转换**。 3. 点「一键配置 MarkItDown 环境」,在页面上选一个解释器。 也可以手工执行: ```powershell python -m pip install "markitdown[all]" ``` ## 卸载后要清掉的东西 - 转换产物(`<源文件名>.md`)**不会被自动删除** —— 它们是工作区里的普通文件,由你决定去留。 - 环境记录与清理日志:看门狗会正常收尾;如果它没能跑完,这两个文件会留在 DSH 数据目录里, 可以手工删掉。 ## 手工卸载 不想走设置页时,用仓库根目录的: ```powershell .\install.ps1 -Uninstall ``` 它的 `-KeepMarkitdown` 与 `-KeepRemovalLog` 参数可以分别保留 markitdown 包和清理日志。 参数表见 [安装文档](installation.md)。 --- > 本文档主要由 AI 生成,判定逻辑对照过 `lib/index.js`(`stillSelectedInProfile` / > `scheduleRemovalCleanup`)与 `lib/removal-watchdog.js`。 > 说明与免责见 [README 的「关于本文档」](../README.md#关于本文档)。