mise cache prune 详解:清理陈旧缓存文件的完整实战指南
mise cache prune 详解清理陈旧缓存文件的完整实战指南【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/misemise 的mise cache prune命令用于按“最后访问时间”清理缓存目录中长时间未被使用的陈旧文件是保持缓存目录体积可控、避免磁盘空间被过期元数据占用的核心维护手段。本文将基于该命令的官方文档见 docs/cli/cache/prune.md并结合仓库源码深入讲解其默认行为、参数用法、底层清理算法以及与其他缓存命令的配合方式读完你可以安全地在本地或 CI 环境中对缓存进行“体检式”清理。命令概览mise cache prune是一条由 usage 规范自动生成文档的命令其完整用法如下Usage:mise cache prune [-v --verbose] [--dry-run] [TOOL]…Aliases:pEffect:modifies state会修改本地状态即实际删除缓存文件Source code:src/cli/cache/prune.rs核心语义Remove stale cache files删除陈旧的缓存文件。与mise cache clear清空全部缓存不同prune 只处理“过期”文件保留仍在有效期内的缓存从而在“省磁盘”与“保速度”之间取得平衡。默认行为30 天未访问即视为陈旧默认情况下该命令会删除最近 30 天内未被访问过的文件By default, this command will remove files that have not been accessed in 30 days.这里的关键词是accessed最后访问时间而非“最后修改时间”。源码中正是通过文件元数据的accessed()时间戳与阈值比较来决定是否删除// src/cache.rs#L469-L478 for f in file::ls(dir)? { let path dir.join(f); let metadata path.metadata()?; let elapsed metadata.accessed()?.elapsed().unwrap_or_default(); if elapsed opts.age { remove(path)?; results.size metadata.len(); results.count 1; } }即只要文件的 atime访问时间距今超过阈值就被判定为“陈旧”并移除。阈值opts.age默认值为// src/cli/cache/prune.rs#L37-L39 age: settings .cache_prune_age_duration() .unwrap_or(Duration::from_secs(30 * 24 * 60 * 60)),也就是 30 天的秒数对应配置项cache_prune_age的默认值30d见 settings.toml 中[cache_prune_age]的default 30d。通过环境变量调整过期阈值官方文档明确说明可以通过环境变量修改这个 30 天阈值Change this with the MISE_CACHE_PRUNE_AGE environment variable.# 将缓存判定为陈旧的时间缩短为 7 天 MISE_CACHE_PRUNE_AGE7d mise cache prune # 临时改为 1 秒便于测试清理效果 MISE_CACHE_PRUNE_AGE1s mise cache prune对应配置项同样可以写进配置文件# ~/.config/mise/config.toml [settings] cache_prune_age 30d # 默认值支持 1h、7d 等时长格式从源码看该配置通过cache_prune_age_duration()解析为Duration当解析结果恰好为0 秒时返回None即表示禁用基于年龄的自动清理见 src/config/settings.rspub(crate) fn cache_prune_age_duration(self) - OptionDuration { let age duration::parse_duration(self.cache_prune_age).unwrap(); if age.as_secs() 0 { None } else { Some(age) } }因此cache_prune_age 0s意味着“无限期保留缓存文件”适用于磁盘充足、希望最大化缓存命中率的场景。参数与 Flags 详解位置参数[TOOL]…指定要清理缓存的工具列表例如node、python不传 TOOL清理所有缓存根目录tool 元数据缓存 外部任务缓存 环境缓存。传一个或多个 TOOL只清理对应工具的缓存目录。源码中的处理逻辑如下src/cli/cache/prune.rslet cache_dirs match self.tool { Some(tools) tools .iter() .filter_map(|tool| { let kebab tool.to_kebab_case(); if kebab.is_empty() { warn!(invalid tool name: {tool}); None } else { Some(CACHE.join(kebab)) } }) .collect(), None cache::cache_dirs()?, };值得注意的两个细节工具名会自动转成 kebab-case如NodeJS→nodejs、GoLand→go-land因为缓存目录按小写连字符命名非法的工具名会被跳过并输出 warn 日志不会导致整个命令失败。对应的端到端测试位于 e2e/cli/test_cache_prune_plugin它验证了“只清理指定工具”的行为MISE_CACHE_PRUNE_AGE1s mise cache prune node if [[ -e $MISE_CACHE_DIR/node/old ]]; then fail node cache was not pruned fi if [[ ! -e $MISE_CACHE_DIR/python/old ]]; then fail python cache was pruned fi测试先分别在node、python目录下放置老文件再用1s阈值只 prunenode最终断言 node 的文件被删除、python 的文件被保留。FlagsFlag说明-v --verbose显示被清理的具体文件路径可叠加源码中ArgAction::Count计数--dry-run只显示将要清理的内容不实际删除任何文件-h --help打印帮助信息--dry-run是安全第一原则的体现先预览再执行避免误删仍在使用的缓存。在 src/cache.rs 的prune()内部dry-run 与 verbose 共用同一打印通道区别仅在于是否真正删除let remove |file: Path| { if opts.dry_run || opts.verbose { info!(pruning {}, display_path(file)); } else { debug!(pruning {}, display_path(file)); } if !opts.dry_run { file::remove_file_or_dir(file)?; } Ok::(), color_eyre::Report(()) };也就是说--dry-run会以info级别逐条打印“将要 pruning 的文件”但不触碰文件系统-v则会在真实删除的同时打印同样的清单。底层清理算法递归、按目录与文件分别处理mise cache prune的实际清理逻辑位于 src/cache.rs 的prune()函数它采用深度优先递归的方式遍历缓存目录对每个子目录递归调用 prune先清理子树空目录只有在“本身也很旧”修改时间超过阈值时才删除if file::ls(subdir)?.is_empty() metadata.modified()?.elapsed().unwrap_or_default() opts.age { remove(subdir)?; results.count 1; }—— 这样不会把刚创建的空目录误删避免缓存结构被破坏文件按 atime 判定accessed().elapsed() opts.age则删除并累计size与count。命令结束时会在终端汇总结果例如cache pruned 12 files, 3.4 MiB若指定了工具则输出形如cache pruned for node, python: 12 files, 3.4 MiB见 src/cli/cache/prune.rs。不传 TOOL 时额外清理环境缓存除了工具元数据缓存prune 还会用独立的env_cache_ttl阈值清理环境缓存CachedEnv::cache_dir()前提是未指定 TOOL 参数// src/cli/cache/prune.rs#L67-L78 if self.tool.is_none() env_cache_dir.exists() { let env_opts PruneOptions { dry_run: self.dry_run, verbose: self.verbose 0, age: settings.env_cache_ttl(), }; let r cache::prune(env_cache_dir, env_opts)?; ... }这意味着一次全量 prune 会同时覆盖两类缓存但它们的过期阈值不同工具缓存用cache_prune_age默认 30 天环境缓存用env_cache_ttl默认 1 小时。这也呼应了 docs/cache-behavior.md 中“环境条目在清理时使用自己的 TTL”的描述。缓存根目录的构成当不指定 TOOL 时prune 遍历的缓存根由cache_dirs()返回src/cache.rs主缓存根dirs::CACHE即MISE_CACHE_DIR默认位于数据目录下的cache/若任务缓存目录task_cache_dir位于主缓存根之外则额外追加该外部任务缓存根避免重复扫描主根下已有的任务缓存。与自动清理auto-prune的关系mise cache prune是手动触发的清理命令而 mise 在运行过程中还会偶尔自动执行同样的 age-based 清理。自动清理逻辑在 src/cache.rs 的auto_prune()中以约1% 的概率触发random::u8().is_multiple_of(100)阈值同样来自cache_prune_age_duration()当设置为0s时自动清理被完全禁用每个缓存根目录使用独立的.auto_prune标记文件控制频率——只有距上次自动清理超过阈值的根才会再次清理避免反复扫描环境缓存同样按env_cache_ttl一并清理。因此MISE_CACHE_PRUNE_AGE/cache_prune_age同时影响手动 prune 与自动 prune两条路径。手动执行mise cache prune适合以下场景磁盘空间告急需要立即回收缓存体积刚调整了阈值想立刻按新阈值清理一次排查缓存相关疑难问题时先--dry-run看清单再动手。与相关命令的配合mise cache prune属于mise cache子命令族配套命令各有分工命令作用对应文档mise cache path显示实际缓存目录路径docs/cli/cache/path.mdmise cache clear删除所有缓存文件不分新旧docs/cli/cache/clear.mdmise cache task查看/管理任务输出缓存docs/cli/cache/task.mdmise cache prune删除陈旧缓存文件本命令docs/cli/cache/prune.md社区常见的工作流组合参考 docs/cache-behavior.mdmise cache path # 查看缓存目录在哪 mise cache prune --dry-run # 预览将被清理的陈旧文件 mise cache prune # 确认无误后执行清理 mise cache clear node # 若版本列表异常可单独清掉 node 的元数据一点提醒prune 清理的是“本地缓存文件”它不会影响已安装的工具也不会刷新远程服务端的元数据例如 troubleshooting 中提到的 versions host。如果发现某个工具的新版本迟迟不出现正确的做法通常是mise cache clear node后重新mise ls-remote node而不是指望 prune 能带来新数据。小结mise cache prune别名p按最后访问时间清理缓存默认阈值30 天可用环境变量MISE_CACHE_PRUNE_AGE或配置项cache_prune_age调整设为0s即禁用基于年龄的清理[TOOL]…支持按工具定向清理工具名自动转为 kebab-case不传时清理全部缓存根并额外按env_cache_ttl清理环境缓存--dry-run用于安全预览-v用于输出被清理文件的明细底层算法递归遍历目录旧文件直接删除空目录仅在自身也足够旧时才删除手动 prune 与运行中的自动清理约 1% 概率触发共用同一套阈值与清理逻辑。掌握了这些细节你就可以放心地把mise cache prune纳入日常维护脚本或 CI 流程让缓存既“用得飞快”又“不会失控”。【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →