![mise Bootstrap Packages 详解:用 [bootstrap.packages] 声明并安装宿主机系统包](http://pic.xiahunao.cn/yaotu/mise Bootstrap Packages 详解:用 [bootstrap.packages] 声明并安装宿主机系统包)
mise Bootstrap Packages 详解用 [bootstrap.packages] 声明并安装宿主机系统包【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/misemise 的[bootstrap.packages]配置段让你把宿主机原生软件包系统库、构建依赖、桌面应用也纳入声明式管理在mise.toml中用manager:package version的形式列出所需包再用mise bootstrap packages status/apply/upgrade/prune等命令查询与应用它们。读完本文你能理解这套机制与 mise 自身[tools]工具管理的分工边界掌握全部子命令的参数与退出码语义并了解其背后SystemPackageManagertrait 的多管理器实现从而在跨平台共享配置、CI 容器初始化等场景中正确使用它。基本用法声明与预览在[bootstrap.packages]中声明共享的宿主包然后用mise bootstrap packages apply或完整的 mise bootstrap 流程来应用。该机制适用于原生库、构建依赖和宿主应用。从你机器所用的包管理器开始Debian/Ubuntu 宿主例如[bootstrap.packages] apt:libssl-dev latest apt:build-essential latest先预览再执行mise bootstrap packages status mise bootstrap packages apply --dry-run mise bootstrap packages apply每条条目的键是manager:package格式——管理器前缀是必需的值是一个版本latest表示装管理器当前能装的版本或在管理器原生格式支持时写入版本钉pin详见各管理器页面如 apt、brew。latest会接受已安装的任意版本——它不会在每次 apply 时触发升级升级要用mise bootstrap packages upgrade。这一点在源码中有对应PackageRequest 结构体中version字段是OptionString注释明确写道latest解析为None各管理器在安装时再把 pin 渲染成各自的原生语法apt 用nameversiondnf 用name-version。按操作系统过滤table 形式的条目用 table 形式可以为单个包限定操作系统或 OS/架构。os接受单个值或列表使用与[tools]相同的名称和别名linux、macos、windows、linux/x64、macos/arm64等。省略version时默认为latest[bootstrap.packages] brew:coreutils latest brew-cask:1password { os macos } brew-cask:font-jetbrains-mono { os [linux, macos] } pacman:libreoffice-fresh { state absent } winget:BurntSushi.ripgrep.MSVC { os windows }声明式移除state absentpacman条目可以设置state absent来声明式地移除一个包。此时mise bootstrap packages status --missing会把已安装但配置要求移除视为漂移而mise bootstrap packages apply会执行卸载。其他内置管理器目前只支持默认的state present。源码层面这对应 PackageDesiredState 枚举Present/AbsentSystemPackageManager::remove 的默认实现直接报错 {manager}does not support declarative package removal只有实现了supports_remove()的管理器即 pacman才走真实移除路径——这与文档仅 pacman 支持 absent的说法完全一致。brew-cask 的 adopt 选项brew-cask条目额外接受adopt true用于接管已经安装在 cask 目标位置的、内容完全相同的应用接管而非重装。设置bootstrap.brew.adopt true可让接管成为所有 cask 的默认行为并支持按 cask 用adopt false覆盖。详见 brew cask 文档。宿主机包 vs mise 工具如何选择维度[bootstrap.packages][tools]版本切换安装结果在项目外共享切换目录不会切换每个项目可选独立版本shim不创建 shim创建 shim 并纳入 PATH定位属于宿主包数据库/共享 prefix 的软件需要按项目隔离的开发工具宿主包声明在管理器支持时可以带版本约束但安装是项目外共享的mise 不为它们创建 shim。需要按项目选择隔离版本时用[tools]软件属于宿主包数据库或共享 prefix 时用[bootstrap.packages]。管理器列表可通过包管理器插件扩展覆盖编辑器扩展、其他应用的插件等宿主拥有的状态。从源码看all_managers() 在内置管理器之外加载PluginType::Package类型的插件管理器插件名与内置管理器冲突时会发出警告并忽略插件。支持的包管理器管理器平台文档页apkAlpine LinuxapkaptDebian, UbuntuaptaurArch, Manjaro需 yay 或 paruAURdnfFedora, RHEL, CentOS, Rocky, AlmadnfpacmanArch, ManjaropacmanbrewmacOS (arm64)、Linux (x86_64/arm64)——无需安装 Homebrewbrewbrew-caskmacOSLinux仅字体类 cask——无需安装 HomebrewbrewflatpakflatpakCLI 在PATH上的 Linuxsystem 作用域Flatpakflatpak-userflatpakCLI 在PATH上的 Linuxuser 作用域FlatpakmasmasCLI 在PATH上的 macOSmaswingetwingetCLI 在PATH上的 WindowsWinGetplugin由插件声明Package plugins注意 mise 的brew是内置实现而非依赖本机 Homebrewbrew 模块 下有pour.rs、resolve.rs、prefix.rs、cask/等独立子模块自行解析 formula/cask 元数据并管理自己的 prefix。语义合并、过滤与手动执行默认为声明式、累加式——条目按 配置层级全局 → 项目做键的并集合并。项目可在全局列表之上追加包并覆盖全局条目的版本钉更局部的配置可以用state absent覆盖一个 pacman 条目。pruning 是显式的、按管理器范围的破坏性操作mise bootstrap packages prune默认针对 Homebrew插件拥有的包需要mise bootstrap packages prune --manager plugin。它只移除当前配置以及受信任、可加载的 tracked 配置都不再需要的包。按 OS 过滤——os选择器不匹配的条目、以及当前机器上不可用的管理器对应的条目都不会被操作因此同一份配置可以跨平台工作macOS 上忽略apt条目、Ubuntu 上忽略dnf条目依此类推。brew在 macOS 和 Linux 上都可用brew-cask在 macOS 上可用Linux 上仅支持无生命周期钩子、无结构化安装步骤的字体类 caskflatpak/flatpak-user在flatpakCLI 位于PATH的 Linux 上可用mas在masCLI 位于PATH的 macOS 上可用winget在wingetCLI 位于PATH的 Windows 上可用。status 命令仍会列出不可用的管理器因此不会有东西被静默隐藏。仅手动安装——mise 从不隐式安装系统包。mise install在包缺失时只会打印一次性提示显式的packages apply、packages use和完整的mise bootstrap才执行安装packages upgrade更新已安装的包。未知管理器带警告忽略并给出包插件安装提示因此使用新版 mise 管理器名写的配置在旧版上仍能被解析。对应源码src/cli/install.rs 中mise install的缺失提示文案为 {missing} system package(s) from [bootstrap.packages] are missing. Install them with ...驱动层在 src/cli/system/driver.rs 中未配置任何条目时会打印 no bootstrap packages configured in [bootstrap.packages]。命令详解查询状态statusmise bootstrap packages status --json mise bootstrap packages status --missingstatus别名ls输出 Manager / Package / Installed / State 表格--json-J输出 JSON。--missing在任一配置包未处于期望状态时以退出码 1 退出可直接用作 CI 检查。从 SystemStatus 的状态机可以看到完整的状态集合installed、missing、needs repair、version mismatch、unexpectedly installed要求 absent 却已安装、skippedOS 过滤或不支持当前平台。被system_packages.managers设置排除的管理器其条目标记为skipped (excluded by the system_packages.managers setting)管理器不可用时同样逐条列出而非隐藏——这正是文档nothing is silently hidden的实现。应用与记录apply 与 usemise bootstrap packages status --json mise bootstrap packages status --missing mise bootstrap packages apply --manager apt --dry-run mise bootstrap packages apply --manager apt mise bootstrap packages apply --update mise bootstrap packages use apt:curl mise bootstrap packages use -g brew:ffmpeg mise bootstrap packages use winget:BurntSushi.ripgrep.MSVC不带包参数的apply读取当前激活的配置显式请求如mise bootstrap packages apply apt:curl可以不记录到配置就直接安装。若希望包保持声明状态用use。--update按管理器规则刷新元数据apk:--update-cache、apt:apt-get update、winget:source update见 SystemInstall 的参数定义--yes跳过 mise 的确认提示但不提供 sudo 凭据。mise bootstrap packages use就是系统包版的mise use它把manager:package version写入mise.toml默认本地文件-g写全局~/.config/mise/config.toml并安装缺失的部分。对当前机器不可用管理器的条目会只写入不安装——这正是共享配置在 Mac 上写下apt:行的工作方式。use还有两个实用细节见 SystemUse版本钉用mise bootstrap packages use apt:curl8.5.0-2不带或latest则不写 pin。brew formula 与 cask 的是名称的一部分如brew:postgresql17、brew-cask:temurin17不是 mise 的版本选择器mas 用数字 ADAM ID不支持钉。支持-e/--env与-p/--path指定写入哪个配置文件同一包重复出现时后者生效。管理器解析在触碰配置文件之前完成拼错管理器名不会被写进配置。导入与清理import 与 prunemise bootstrap packages import --manager brew --dry-run mise bootstrap packages import --manager brew mise bootstrap packages prune --manager brew --dry-run不带--dry-run执行前先查看 prune 计划。formula 的清理可能涉及 Homebrew 自身安装的软件而不仅仅是 mise 安装的。mise bootstrap packages import --manager brew是 formula 的反向操作读取 Homebrew 激活的opt链接把 formula 以brew:formula latest写入[bootstrap.packages]。默认只导入 keg receipt 表明应请求安装的 formula--all连依赖 formula 一起导入。之后 prune 会保留这些 formula因为它们已声明在配置中。mise bootstrap packages prune --manager brew移除不再被当前配置或受信任、可加载的 tracked 配置需要的已链接 brew formula包括真实 Homebrew 安装的 formula。它是 mise 的声明式清理命令精神类似于 Homebrew Bundle 的清理而非上游那个已被 Homebrew 移除的旧brew prune。mise bootstrap packages prune --manager brew-cask只移除满足严格条件的 mise 拥有的直接产物有当前安装时 receipt、内容指纹未变化。它会跳过旧版 receipt、Homebrew 拥有的 cask、pkg 与命令 wrapper 产物、带生命周期动作的 cask、目标已变化或被共享的条目、不完整的安装事务每条跳过都带原因且从不应用zap元数据。对包插件管理器prune 只考虑 mise 在PackageInstall期间观察到从缺失变为已安装的包已存在或手动安装的包绝不会被接管。插件必须实现PackageUninstalldry run 只打印批准的移除批次而不调用 hookmise 在实际移除后用PackageInstalled校验再更新自己的所有权状态。升级upgrademise bootstrap packages upgrade --manager apt --dry-run mise bootstrap packages upgrade --manager apt mise bootstrap packages upgrade --manager wingetmise bootstrap packages upgrade刷新包管理器元数据并把已安装的配置包升级到最新可用版本——apk、apt、dnf 还会遵守配置中的版本钉AUR、pacman、brew、brew-cask、flatpak、flatpak-user、mas 无法安装钉pin 条目会被带警告地跳过。尚未安装的包会被跳过——那是mise bootstrap packages apply的职责。具体行为brew 会倒入 formula 当前的 bottle 并替换旧 kegbrew-cask 安装当前 cask 产物flatpak/flatpak-user 在其各自作用域更新已配置的应用与运行时mas 执行mas upgradewinget 对每个已配置的已安装包执行精确 ID 的winget upgrade。这与源码中 SystemPackageManager::upgrade 的默认实现一致默认upgrade直接复用install对 brew 恰好正确——倒入不同版本的 formula 即替换旧 kegapt/dnf/pacman 则重写为先刷新元数据再调用原生 upgrade 命令SystemUpgrade 也不提供独立--update标志注释解释了原因upgrades refresh metadata themselves (stale lists would make them silent no-ops)。另外mise doctor也会报告已配置的宿主包并在缺失时给出警告。选择哪些管理器运行默认情况下mise 作用于当前机器上所有可用的已配置管理器。可用性检查的是支持平台与必需命令而不是选一个首选管理器。例如一台 Linux 机器若同时声明了 apt 和 mise 内置 Homebrew 管理器两者都会生效。当多个管理器都适用一台机器装了多个包管理器或共享配置里列出了你不想要这里的管理器用system_packages.managers设置选子集[settings] system_packages.managers [apt]也可以配合上文逐包的os选择器使用。若要把这些选择放进mise.macos.toml或mise.linux.toml需要用-E/MISE_ENV激活该配置环境或启用 auto_env仅凭文件名目前不会激活。sudo 行为apk、apt、dnf、pacman 管理器的包变更需要 rootmise 在必要时使用 sudo。AUR 辅助工具以当前用户构建自行处理安装环节的提权Flatpak 用户级安装不需要 root。登录 shell 配置需要编辑/etc/shells时走的是同一条 sudo 路径已是 root容器、CI不用 sudo直接执行命令交互式终端例如sudo apt-get install ...走正常 sudo 提示非交互且无免密 sudomise 报错并打印可手动执行的完整命令——绝不会挂起等待密码所有情况下完整命令行在执行前都会记录到日志。设置system_packages.sudo false可彻底禁用提权mise 改为打印命令让你自己执行。Homebrew formula 安装可能需要提权来创建规范 prefixcask 安装器的产物有时也需要提权见 brew。包插件从不使用 mise 的 sudo 路径也绝不应自行提权。CI 用法容器里通常已经是 root因此不会有提示mise bootstrap packages apply --yes mise installmise bootstrap --yes把两者合并若定义了名为bootstrap的任务随后还会执行它——一条命令即可初始化一台新机器或容器。mise bootstrap packages status --missing在缺包时退出码为 1可作为一个不安装任何东西的便捷 CI 检查。当必需的管理器可能不可用时也要检查 JSON 状态输出被跳过的声明并不能证明其包已安装。【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考