mise plugins uninstall完全指南:移除插件、保留工具版本与--purge深度清理
【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise
mise plugins uninstall是 mise 中用于移除已安装插件的命令:它默认只删除插件本身的代码与仓库,保留插件已安装的工具版本;只有显式传入--purge时,才会连同插件的 installs、downloads 与 cache 一并清除。本篇以 docs/cli/plugins/uninstall.md 为骨架,结合 src/cli/plugins/uninstall.rs 的完整实现与 e2e/cli/test_plugins_packslip 等测试,逐层拆解其语法、别名、参数、底层删除流程与常见实操场景,帮助你安全、可控地管理 mise 插件生命周期。
命令速览
| 项目 | 说明 |
|---|---|
| 用法 | mise plugins uninstall [-a --all] [-p --purge] [PLUGIN]… |
| 别名 | remove、rm |
| 效果 | destructive(可能删除或不可逆覆盖文件) |
| 源码 | src/cli/plugins/uninstall.rs |
| 所属命令组 | mise plugins [FLAGS] [SUBCOMMAND],别名p/plugin/plugin-list |
在 src/cli/plugins/uninstall.rs 中,该子命令通过usage_rs::Args派生定义,并声明了visible_aliases = ["remove", "rm"]——这正是mise plugins remove my-tool与mise plugins rm my-tool可以直接使用的来源。命令注释同时明确了默认行为:"Tool installations are retained by default. Pass--purgeto also remove installs, downloads, and cache associated with the selected plugins."
注意:
mise plugins uninstall移除的是插件(提供安装/环境逻辑的代码),与mise uninstall(卸载某个工具的具体版本)是两回事,下文会详细区分。
参数与标志
[PLUGIN]…—— 要移除的一个或多个插件
位置参数,可同时传入多个插件名,逐个执行卸载。例如:
mise plugins uninstall my-tool mise plugins uninstall my-tool another-tool在实现中,plugin: Vec<String>会被依次遍历:对每个名字先调用unalias_backend归一化,再执行卸载逻辑(见 src/cli/plugins/uninstall.rs)。
-a, --all—— 移除所有插件
不传插件名、直接列出全部已安装插件并逐个卸载。该标志与位置参数互斥(源码中标注为conflicts = "plugin",见 src/cli/plugins/uninstall.rs):
mise plugins uninstall --all--all模式下插件列表来自install_state::list_plugins()(见 src/cli/plugins/uninstall.rs),即 src/toolset/install_state.rs 中读取的安装状态快照。由于该模式会一次性清空所有插件,建议配合mise plugins ls先确认当前安装清单。
-p, --purge—— 连带清除安装、下载与缓存
在移除插件代码之外,进一步删除该插件后端关联的installs_path、cache_path、downloads_path三个目录。对应底层实现位于 src/backend/mod.rs:
fn purge(&self, pr: &dyn SingleReport) -> eyre::Result<()> { remove_all_with_progress(&self.ba().installs_path, pr)?; remove_all_with_progress(&self.ba().cache_path, pr)?; remove_all_with_progress(&self.ba().downloads_path, pr)?; Ok(()) }也就是说,--purge会真正回收磁盘空间,而默认卸载不会。默认的downloads目录(~/.local/share/mise/downloads)本身在安装/卸载后通常会被清理(见 docs/directories.md),--purge主要针对的是 installs 与 cache 中遗留的产物。
-h, --help—— 打印帮助
输出该子命令的完整用法、别名与参数说明,与 docs/cli/plugins/uninstall.md 内容一致。
默认行为:只删插件,保留工具安装
这是本命令最核心、也最容易混淆的设计。文档原文明确写道:
Tool installations are retained by default. Pass
--purgeto also remove installs, downloads, and cache associated with the selected plugins.
即默认情况下,mise plugins uninstall my-tool之后:
~/.local/share/mise/plugins/my-tool(插件代码/仓库)被删除;~/.local/share/mise/installs/my-tool/*(已安装的工具版本)依然保留;- 对应工具的下载与缓存也保留。
因此在使用上,docs/plugin-usage.md 给出了明确的实操建议:
mise plugin remove my-plugin并且强调:被保留的工具版本可能仍需要该插件来解析其可执行文件路径或环境变量。如果不再需要这些工具,应先用mise uninstall卸载多余的工具版本,再移除插件;对单工具插件,mise plugin remove --purge my-plugin才会连带清掉 installs、downloads 与 cache。最后,如果不再需要该集成,应同时删除mise.toml中对应的[plugins]与[tools]条目。
底层卸载流程(源码级解析)
mise plugins uninstall的处理链分为三层,理解它有助于预判命令的实际影响。
1. 命令行入口:收集目标并逐个卸载
src/cli/plugins/uninstall.rs 的run()先确定目标插件集合:
--all为真时,取install_state::list_plugins()的全部键;- 否则直接使用位置参数列表。
随后对每个名字执行unalias_backend归一化(见 src/backend/mod.rs):dotnet-core→dotnet、nodejs→node、golang→go,并剥掉core:前缀。这一步骤确保用户用习惯的别名书写时也能命中正确的插件。
2. 单插件卸载:存在性检查 + 删除
uninstall_one(src/cli/plugins/uninstall.rs)的逻辑是:
- 通过
plugins::get(plugin_name)解析插件; - 若插件未安装,输出
warn!("{} is not installed", ...)后直接返回(不视为错误); - 若已安装,创建进度报告(前缀为
plugin:<name>),调用plugin.uninstall(pr); - 若同时指定了
--purge,再调用backend::get(&plugin_name).purge(pr); - 最后以
"uninstalled"消息结束进度条。
其中PluginEnum::uninstall会对 asdf、vfox、vfox-backend 与 package 四类插件统一分派(见 src/plugins/mod.rs)。
3. 不同插件类型的卸载差异
- asdf 插件(src/plugins/asdf_plugin.rs):先检查
is_installed(),随后执行pre-plugin-remove钩子(对应插件目录bin/pre-plugin-remove,见 docs/asdf-legacy-plugins.md),再通过remove_git_plugin_source删除插件源。 - vfox 插件(src/plugins/vfox_plugin.rs):额外处理了内嵌插件场景——如果插件是 mise 内嵌的且磁盘上没有对应目录,则输出
plugin:<name> is embedded in mise, cannot uninstall的警告并跳过(内嵌插件不可卸载)。 - package 插件:
uninstall为空操作(见 src/plugins/mod.rs)。
remove_git_plugin_source(src/plugins/mod.rs)会同时删除插件目录以及(若存在)其托管 Git 仓库路径,确保插件代码完全清除。
实操示例
卸载单个插件(保留工具版本)
mise plugins uninstall my-tool # 等价写法 mise plugins remove my-tool mise plugins rm my-tool卸载后可用以下命令验证:
mise plugins ls # 确认 my-tool 不再出现在列表中 mise where my-tool # 确认工具安装目录是否仍保留一次性移除所有插件
mise plugins uninstall --all彻底清理(插件 + 安装 + 下载 + 缓存)
mise plugins uninstall my-tool --purge # 或 mise plugins remove --purge my-tool这会删除installs、downloads与cache中与该插件后端关联的目录,适合在确认不再使用该工具后回收磁盘空间。
结合配置清理
如果插件来源写在配置中,还需移除相应条目,否则下次mise install/mise use可能重新拉取:
# mise.toml 中删除对应条目 [plugins] # my-tool = "https://github.com/your-org/my-tool-plugin" [tools] # my-tool = "2.0.0"与相关命令的分工
| 命令 | 作用 | 典型场景 |
|---|---|---|
mise plugins uninstall [PLUGIN]… | 移除插件代码(默认保留工具安装) | 不再需要某个自定义安装/环境逻辑 |
mise plugins uninstall --purge [PLUGIN]… | 插件 + installs/downloads/cache 一并清除 | 完全弃用该工具,回收磁盘 |
mise uninstall <TOOL>@<VERSION> | 卸载工具的具体版本 | 只清理工具版本、保留插件 |
mise plugins install [PLUGIN] | 安装插件 | 与 uninstall 配对的生命周期起点 |
mise plugins update [PLUGIN] | 更新插件源码 | 升级插件实现,不动工具版本 |
mise plugins ls | 列出已安装插件 | 卸载前确认清单 |
生命周期关系可概括为:install(docs/cli/plugins/install.md)→update(docs/cli/plugins/update.md)→uninstall。注意update更新的是插件代码而非工具版本,uninstall默认保留工具版本——两者都遵循"插件与工具版本相互独立"的设计原则。
目录结构与清理边界
根据 docs/directories.md:
~/.local/share/mise/plugins:插件安装目录,mise plugins uninstall直接作用于此;~/.local/share/mise/installs:工具安装目录(如installs/node/24.0.0),默认卸载不删除;~/.local/share/mise/downloads:下载产物目录,安装/卸载后默认清理,--purge会显式清除残留;~/.cache/mise:缓存目录,--purge会删除关联缓存(mise cache clear可用于整体清理元数据缓存)。
所有路径均可通过MISE_DATA_DIR、MISE_CACHE_DIR等环境变量或XDG_*变量覆盖。默认的插件目录写法(见 docs/directories.md):
mkdir -p ~/.local/share/mise/plugins ln -s ~/src/mise-my-tool ~/.local/share/mise/plugins/my-tool测试验证
仓库中的端到端测试直接覆盖了本命令的两种典型场景(见 e2e/cli/test_plugins_packslip):
- 第 30-32 行:安装外部 vfox 插件后执行
mise plugins uninstall external-bfs,并断言插件元数据文件(metadata.lua)不再存在; - 第 66-67 行:
mise plugins uninstall bfs后断言插件目录不存在; - 第 80-81 行:再次
mise plugins uninstall bfs后重新安装,验证可重复的安装/卸载生命周期。
这些测试印证了:卸载后插件目录被真正删除、同名插件可以再次安装、且整个流程可幂等重复。zsh 补全测试(e2e/cli/test_completion_dynamic)也覆盖了mise plugins uninstall的动态补全。
安全提示
- 本命令标注为destructive:
--purge会不可逆删除 installs、downloads 与 cache,执行前请确认不再需要相关工具版本; - 保留的工具版本若仍被
mise.toml引用,可能因插件缺失而无法解析可执行路径或环境(见 docs/plugin-usage.md),建议先mise uninstall清理无用版本; - 插件代码在安装和使用期间以你的权限运行(docs/plugin-usage.md),卸载时同样可能触发
pre-plugin-remove钩子,请确保插件来源可信后再安装。
小结
mise plugins uninstall是一个"默认保守、可选激进"的插件移除命令:不带--purge时只删除插件代码并保留工具安装,适合切换插件实现或临时停用集成;带--purge时连同 installs、downloads、cache 一起清理,适合彻底弃用。理解其与mise uninstall、mise plugins install/update的分工,以及 asdf/vfox 插件在卸载钩子与内嵌插件上的差异,就能安全、精准地管理 mise 的插件生命周期。
【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考