
mise bootstrap packages status声明式系统包状态检查的完整指南【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise导读本文围绕 mise 的mise bootstrap packages status命令展开讲解如何从[bootstrap.packages]配置声明出发检查宿主机系统包原生库、构建依赖、宿主应用是否处于期望状态。读完本文你将掌握该命令的两种输出格式表格与 JSON、--missing退出码在 CI 中的应用方式以及状态机背后期望状态 vs 实际状态的判定逻辑与各状态枚举的真实含义。命令概览mise bootstrap packages status是 mise bootstrap 体系mise bootstrap packages中用于只读检查的子命令其完整定义见 status 命令文档对应的 Rust 实现位于 src/cli/system/status.rs。用法mise bootstrap packages status [-J --json] [--missing]别名ls由 usage 属性visible_alias ls声明效果标签read-only只读不会安装、升级或删除任何包作用展示[bootstrap.packages]中声明的系统包的当前状态该命令不会触发任何包管理器的写操作适合在安装apply之前预览、在 CI 中做一致性校验、以及在故障排查时核对配置声明与机器实际状态的差异。标志Flags标志说明-J --json以 JSON 格式输出状态结果便于脚本解析--missing若任一已配置的包未处于期望状态则以退出码 1 结束-h --help打印帮助信息两个核心标志在源码中对应SystemStatus结构体的两个字段src/cli/system/status.rs#L20-L28json: bool与missing: bool。注意--missing的语义是任何包不在期望状态desired state即失败而非字面上的包缺失——例如当配置声明state absent而包意外仍被安装时同样属于偏离期望状态会触发退出码 1详见下文状态判定。基本用法示例# 以表格形式列出所有已配置包的状态 mise bootstrap packages status # 以 JSON 形式输出供脚本/CI 解析 mise bootstrap packages status --json # 检查是否存在偏离期望状态的包有则退出码为 1 mise bootstrap packages status --missing--missing常作为 CI 检查使用mise bootstrap packages status --missing在包缺失时以退出码 1 结束无需实际安装任何东西即可完成一致性校验见 bootstrap/packages 索引文档的 CI 一节。同时文档建议在所需包管理器可能不可用的环境中还应结合 JSON 输出检查——被跳过的声明并不代表其包已安装。输出解析表格模式默认列头为Manager、Package、Installed、Statesrc/cli/system/status.rs#L164-L165。当没有任何已配置的包时会输出提示信息nothing configured in [bootstrap.packages]而非空表src/cli/system/status.rs#L160-L162。JSON 模式以包管理器名为键输出一个对象结构大致为{ apt: { available: true, packages: [ { package: libssl-dev, requested_version: latest, desired_state: present, state: installed, installed_version: 3.0.16-1, auto_updates: false } ] } }字段说明与源码json!构造逻辑一致src/cli/system/status.rs#L119-L133available当前机器上该管理器是否可用package包名不含管理器前缀requested_version配置中声明的版本缺省时显示为latestdesired_statepresent或absent来自 PackageDesiredState 枚举state实际状态installed、missing、needs_repair、version_mismatch、skipped、unexpectedly_installed等空格会被替换为下划线installed_version实际安装的版本缺失时为空字符串reason可选当状态为 skipped 或存在异常时附带原因auto_updates可选为 true 表示该包属于自动更新型安装如 brew-cask 中上游声明auto_updates的应用其版本取自安装回执而非实时应用包版本。配置声明状态的判定基准status检查的对象是[bootstrap.packages]中的声明。每个条目以manager:package为键、以版本字符串或表为值例如[bootstrap.packages] apt:libssl-dev latest apt:build-essential latest brew-cask:1password { os macos } pacman:libreoffice-fresh { state absent }值为latest时只要管理器已安装该包即视为满足不会每次apply都触发升级升级需显式执行mise bootstrap packages upgrade见 bootstrap/packages 索引。表形式支持os选择器linux、macos、windows、linux/x64等与statepresent/absent。state absent目前仅pacman支持声明删除一个包status --missing会把该包仍被安装视为漂移apply则会将其移除docs/bootstrap/packages/index.md#L48-L51。os不匹配的条目、或管理器在当前机器不可用的条目不会被操作例如 macOS 上忽略apt:条目、Ubuntu 上忽略dnf:条目brew在 macOS 与 Linux 均可用winget需要 Windows 且wingetCLI 在PATH中。但 status 命令仍会列出这些不可用管理器确保不会静默隐藏任何声明docs/bootstrap/packages/index.md#L100-L109。状态判定逻辑源码级status的判定分两层先判断管理器是否可用再判断每个包的实际状态。第一层管理器可用性对每个从配置中解析出的管理器源码首先计算一个reasonsrc/cli/system/status.rs#L38-L43若管理器被system_packages.managers设置排除reason为excluded by the system_packages.managers setting否则调用mp.manager.unavailable_reason_async()检查平台与所需命令例如 Linux 上缺flatpakCLI、macOS 上缺masCLI。存在reason时该管理器下的所有包以skipped状态列出JSON 中available: false并携带 reason不会进一步检查同时该层不计入--missing的失败判定。第二层包状态机管理器可用时调用mp.manager.installed(mp.requests)获取每个包的 PackageState再结合请求的desired状态映射为输出src/cli/system/status.rs#L79-L118实际状态PackageState期望 present期望 absentInstalled { version }installed不触发退出码unexpectedly installed触发InstalledAutoUpdates { version }Unix如 brew-cask 自动更新应用installed显示(auto-updates)unexpectedly installed触发Missingmissing触发absent符合期望不触发NeedsRepair { installed }needs repair触发unexpectedly installed触发VersionMismatch { installed }version mismatch触发unexpectedly installed触发Unavailable { reason }Unixskipped携带 reasonskipped携带 reason其中触发退出码意味着--missing置位时any_missing被置为 true最终返回退出码 1src/cli/system/status.rs#L172-L174InstalledAutoUpdates是 brew-cask 的特例上游 cask 声明了auto_updates时状态仍视为已安装其版本取自安装回执cask receipt version不一定是应用自更新后的实时版本src/system/packages/mod.rs#L66-L72输出时会标注(auto-updates)src/cli/system/status.rs#L139-L141VersionMismatch表示包已安装但版本与配置中的固定版本pin不一致NeedsRepair表示已安装但管理器记录需要本地修复Unavailable表示管理器在当前主机可用但单个包在当前平台不受支持区别于管理器层面的不可用。与 apply / prune / upgrade 的关系status是只读体检它与[bootstrap.packages]家族其他命令构成完整闭环见 bootstrap/packages 命令总览mise bootstrap packages apply执行安装有--dry-run预览、--manager指定管理器、--update刷新元数据、--yes跳过确认。status可作为apply之前的预检mise bootstrap packages use把manager:package version写入mise.toml-g写全局并安装缺失项——是mise use在系统包上的对应物mise bootstrap packages prune显式、按管理器作用域的清理默认 Homebrew只移除当前配置及受信任的可加载配置不再需要的包mise bootstrap packages upgrade刷新元数据并把已安装的配置包升级到最新版apk/apt/dnf 还遵循配置中的版本固定未安装的包会被跳过——那是apply的职责mise bootstrap packages import从 Homebrew 的opt链接反向生成brew:声明--all时包含依赖公式。mise doctor同样会报告已配置的系统包并在缺失时给出警告docs/bootstrap/packages/index.md#L207-L208可作为status之外的第二重体检入口。实战场景场景一apply 前预览mise bootstrap packages status mise bootstrap packages apply --dry-run mise bootstrap packages apply先看期望状态与实际的差距再用--dry-run确认安装计划最后才真正执行该三步流程亦见于 bootstrap/packages 索引文档。场景二CI 一致性检查容器内通常已以 root 运行无交互提示可直接mise bootstrap packages status --missing mise bootstrap packages apply --yes mise install或一步到位使用mise bootstrap --yes同时执行 packages、repos、dotfiles、tools 与可选的bootstrap任务见 bootstrap 命令。status --missing作为纯只读检查非常适合在流水线早期拦截配置声明未落地的漂移。场景三跨平台共享配置下的状态核对一份共享配置可能同时含apt:、brew:、winget:条目。在 macOS 上执行status时apt:条目会以skipped列出管理器不可用不会误报为缺失也不会静默隐藏。此时若用--missing做检查应结合--json确认 skipped 原因避免把管理器不可用误判为配置失败docs/bootstrap/packages/index.md#L267-L270。场景四限定参与的管理器若本机安装了多个可用管理器或共享配置中列了本机不需要的管理器可用设置system_packages.managers限定settings 文档[settings] system_packages.managers [apt]被排除的管理器在status输出中会明确标注excluded by the system_packages.managers setting便于区分故意排除与平台不可用。注意事项与边界status是 read-only 操作但请留意命令效果标签仅描述命令的预期操作配置求值、缓存与所需工具安装仍可能产生副作用它不是沙箱保证docs/cli/index.md#L24-L27。平台相关的输出细节如InstalledAutoUpdates、Unavailable状态仅在 Unix 下编译Windows 上的状态枚举略有差异源码中以#[cfg(unix)]标注见 src/system/packages/mod.rs#L69-L88。未知的管理器会被忽略并给出警告同时提示安装 package-plugin——这让使用更新版本 mise 编写的配置在旧版本上依然可解析docs/bootstrap/packages/index.md#L115-L116。进一步阅读bootstrap.packages 配置与全部子命令Host packages 概念文档声明语法、管理器支持矩阵、语义bootstrap 总览命令全局标志与参数语法【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考