ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

mise generate install-script 完全指南:为开源项目生成开箱即用的 mise 自举安装脚本

mise generate install-script 完全指南:为开源项目生成开箱即用的 mise 自举安装脚本 mise generate install-script 完全指南为开源项目生成开箱即用的 mise 自举安装脚本【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/misemise generate install-script是 mise 提供的一条代码生成命令它把官方的install.sh安装器打包进一个项目可提交的包装脚本让尚未安装 mise 的贡献者克隆仓库后一条命令即可完成 bootstrap。本指南以 install-script 参考文档 为主线结合 install_script.rs 源码 与 e2e 集成测试完整讲解命令的全部参数、生成脚本的内部工作原理、项目本地化--localize模式、Windows 启动器生成以及背后的签名校验机制读完即可在自己的项目里落地一套跨平台、零依赖的 mise 自举流程。一、这个命令解决什么问题mise 是一个集「开发工具管理、环境变量、任务执行」于一体的工具贡献者要参与项目开发通常需要先安装它。mise generate install-script的设计目标很明确面向贡献者机器上可能根本没有 mise的项目。做法是生成一个自带安装逻辑的 bash 脚本可选再加一个 Windows 启动器把它提交进仓库贡献者克隆后直接执行脚本会在本地把指定版本的 mise 下载下来然后用exec把自己替换成真正的 mise 进程。之后./bin/mise install、./bin/mise run task都能正常工作全程不需要贡献者预先安装任何东西。需要特别说明的是该命令的语义边界它只解决怎么把 mise 装到项目里不是机器初始化machine setup。这正是它从mise generate bootstrap更名而来的原因——旧名字容易被误读为mise bootstrap整机环境配置。旧名目前仍可用但已标记废弃将在 mise 2027.9.0 移除源码中的废弃警告时间为 2026.9.0见 generate/mod.rs。二、命令用法与全部参数基本用法mise generate install-script [FLAGS]该命令属于mise generate命令族别名gen/g家族内还有config、devcontainer、git-pre-commit、github-action、task-docs、task-stubs、tool-stub等生成器参考 config 文档。参数总览参数说明默认值-l, --localize将 mise 数据与缓存放到项目本地目录隔离 mise 状态关闭-V, --version VERSION指定要获取的 mise 版本最新稳定版-w, --write [WRITE]把脚本写入文件并加可执行权限而非打印到 stdout不带值时默认./bin/mise打印到 stdout--localized-dir LOCALIZED_DIR--localize模式下数据存放目录.mise--windows额外生成一个 Windows 启动器WRITE.cmd依赖--write关闭-h, --help打印帮助—几个关键行为需要在用之前搞清楚--write与 stdout 二选一。不传--write时脚本直接打印到终端适合先预览传了则写入文件并chmod x。源码中write参数定义为num_args0..1default_missing ./bin/miseinstall_script.rs所以-w后面不跟路径时自动落到./bin/mise。--windows强制要求--write源码requires write。原因很朴素stdout 一次只能承载一个文件而--windows一次要产出两个文件。集成测试也专门断言了这一点mise generate install-script --windows必须失败e2e 测试。--localize不是沙箱。它只是把 mise 的数据、配置、缓存目录隔离到项目内生成脚本后续执行的任意命令仍然拥有当前用户的完整权限不要把它当作 OS 级沙箱使用。非本地化模式下默认安装路径落在数据目录而非缓存目录$MISE_DATA_DIR/bootstrap/mise-version。这是刻意为之——脚本 exec 出的二进制是每次调用的运行时不是可丢弃的缓存产物而cache clean、cache prune乃至rm -rf ~/.cache/mise这类排障操作会整目录删除缓存源码注释引用了讨论 #12245见 install_script.rs。三、快速上手两分钟接入项目最基础的用法为项目生成bin/mise包装脚本mise generate install-script --write ./bin/mise ./bin/mise install第一条命令生成并写入脚本第二条命令由脚本自行完成未安装则下载的引导随后./bin/mise install会按照项目mise.toml中声明的工具清单安装所有开发工具。若你的仓库需要照顾 Windows 贡献者Windows 无法执行#!/usr/bin/env bash脚本所以没有启动器的话 Windows 贡献者克隆后无物可跑加上--windows生成配套的bin/mise.cmdmise generate install-script --write ./bin/mise --windows .\bin\mise.cmd installmise.cmd会被生成在与 bash 脚本同级的目录。注意--windows是在任何宿主机上都会生成生成者与运行者往往不是同一台机器、不是同一个操作系统生成的.cmd需要提交进仓库。如果你想固定某个具体版本例如锁定 CI 与本地行为一致用-Vmise generate install-script --write ./bin/mise -V 2026.8.4四、生成脚本的内部工作原理源码级剖析InstallScript::generate()的流程install_script.rs可以概括为四步拉取官方安装脚本请求https://mise.jdx.dev/install.sh若指定了-V则请求对应版本的https://mise.jdx.dev/vVERSION/install.sh。验证签名同时拉取url.minisig签名文件用 mise 官方公钥做 minisign 校验见下节确认拿到的 install.sh 未被篡改。提取版本号用正则version\$\{MISE_VERSION:-v([0-9.])\}从 install.sh 中解析出当前版本把这个版本固化进包装脚本。组装脚本把验证过的 install.sh 内容整体嵌入包装脚本缩进 8 个空格在其前后加上变量块与引导逻辑。生成的 bash 脚本核心骨架与 e2e 测试断言一致e2e 测试#!/usr/bin/env bash set -eu __mise_bootstrap() { # ...变量块... install() { local initial_working_dir$PWD # ...嵌入的 install.sh 内容... cd -- $initial_working_dir } local MISE_INSTALL_HELP0 test -f $MISE_INSTALL_PATH || install } __mise_bootstrap exec -a $0 $MISE_INSTALL_PATH $三个值得注意的设计点幂等test -f $MISE_INSTALL_PATH || install意味着本地已有对应版本的 mise 时就完全跳过下载直接执行第二次运行近乎零开销。exec替换进程exec -a $0 $MISE_INSTALL_PATH $用安装好的 mise 二进制替换当前进程并转发全部参数-a $0让$0保持为脚本路径对调用方透明——这就是为什么./bin/mise install用起来和全局mise install完全一致。版本路径按需生成安装路径以请求的版本命名$mise_data_dir/bootstrap/mise-$mise_version而不是生成脚本时固化的版本。因为 install.sh 会尊重MISE_VERSION与MISE_INSTALL_PATH环境变量若路径固定不变一旦调用者用MISE_VERSION覆盖版本test -f会命中旧版本的二进制而静默复用install_script.rs。非本地化模式的变量块非本地化模式默认的变量逻辑源码函数non_localized_bash_varsinstall_script.rs数据目录默认${MISE_DATA_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/mise}。脚本会手工展开前导~mise 自身在解析MISE_DATA_DIR/XDG_DATA_HOME时会展开~但 bash 参数展开不会而 CI 配置里常见MISE_DATA_DIR: ~/.local/share/mise这种写法。不加处理~会被当成相对目录。e2e 测试专门覆盖了此场景e2e 测试。只有默认路径允许回退若调用者显式设置了MISE_INSTALL_PATH即使文件还不存在也以它为准未显式设置时默认$mise_data_dir/bootstrap/mise-$mise_version。旧版兼容早期生成的包装脚本把二进制放在缓存目录$cache_home/mise-$mise_version新脚本会检测到这种情况并直接复用避免重复下载。检测用-x可执行性而非-f保证遗留的不可执行文件会触发重装而不是在 exec 时报错。e2e 测试验证了新旧两种位置共存时数据目录优先e2e 测试。五、--localize项目本地化模式--localize适用于希望完全隔离mise 状态的项目例如 monorepo 中每个子项目用各自独立的 mise 数据。它在 bash 分支中注入的变量块install_script.rslocal project_dir$( cd -- $( dirname -- ${BASH_SOURCE[0]} ) /dev/null cd .. pwd ) local localized_dirlocalized-dir 值 export MISE_DATA_DIR$localized_dir export MISE_CONFIG_DIR$localized_dir export MISE_CACHE_DIR$localized_dir/cache export MISE_STATE_DIR$localized_dir/state local mise_version${MISE_VERSION:-版本} mise_version${mise_version#v} export MISE_INSTALL_PATH${MISE_INSTALL_PATH:-$localized_dir/mise-$mise_version} export MISE_TRUSTED_CONFIG_PATHS$project_dir${MISE_TRUSTED_CONFIG_PATHS::$MISE_TRUSTED_CONFIG_PATHS} export MISE_IGNORED_CONFIG_PATHS$HOME/.config/mise${MISE_IGNORED_CONFIG_PATHS::$MISE_IGNORED_CONFIG_PATHS}要点四个目录全部指向项目本地MISE_DATA_DIR、MISE_CONFIG_DIR、MISE_CACHE_DIRdir/cache、MISE_STATE_DIRdir/state互不污染系统目录。project_dir由脚本自身位置反推基于${BASH_SOURCE[0]}先取脚本所在目录再向上跳一级因此本地化目录是相对路径时会拼到项目根下源码通过shell_words::quote转义绝对路径则原样使用。信任路径与忽略路径MISE_TRUSTED_CONFIG_PATHS注入项目目录让项目内的mise.toml被信任MISE_IGNORED_CONFIG_PATHS忽略用户全局配置防止贡献者本机的 mise 配置干扰项目行为——这正是--localize存在的意义。本地化模式下安装路径默认$localized_dir/mise-$mise_version位于项目内而不是系统数据目录。e2e 测试还验证了本地化脚本的独立性把全局 mise 从PATH中剔除后./bin/mise tasks ls依然能列出任务e2e 测试。六、--windowsWindows 启动器详解Windows 启动器不是 install.sh 的简单移植而是一份刻意独立设计的.cmd批处理发布流程直接发布免安装的mise-vversion-windows-arch.exe无需解压且curl与certutil自 Windows 10 1803 起就内置在%SystemRoot%\system32因此不需要 PowerShell、也不需要新的官方安装器install_script.rs。生成时的校验和预解析关键设计校验和在生成时解析并嵌入脚本运行时的脚本只需要比较两个十六进制字符串。生成流程是拉取https://github.com/jdx/mise/releases/download/vVERSION/SHASUMS256.txt及其.minisig。用 minisign 公钥验证校验和文件签名。按完整文件名精确匹配mise-vVERSION-windows-x64.exe与mise-vVERSION-windows-arm64.exe两条记录避免误匹配旁边的.zip条目把 x64/arm64 两个校验和都嵌入脚本。两个架构的校验和都带上是因为生成主机并不决定运行主机——提交进仓库的.cmd可能在任意架构的 Windows 上执行。脚本中set sum_x64...与set sum_arm64...两行也由 e2e 测试断言存在e2e 测试。运行时的架构与版本解析运行时批处理的关键逻辑源码windows_scriptinstall_script.rs架构探测同时读取PROCESSOR_ARCHITECTURE与PROCESSOR_ARCHITEW6432——后者用于 32 位父进程在 arm64 机器上会误报x86的情况/i参数保证大小写不敏感比较。MISE_VERSION覆盖resolved_version默认等于固化版本若调用者设置了MISE_VERSION则优先版本与固化版本不一致时清空内嵌校验和回退到运行时下载SHASUMS256.txt再解析。否则覆盖版本要么被拒绝要么更糟——拿别的版本的哈希来校验install_script.rs。下载与校验curl -fsSL下载 exe 到%TEMP%certutil -hashfile计算 SHA256逐字节比较后move到MISE_INSTALL_PATH再goto :run执行。校验失败、下载失败、移动失败分别走:fail_*分支并清理临时文件、给出明确报错。certutil输出陷阱摘要打印在第二行且周边标签随系统语言本地化日文系统上是日文所以脚本按位置取行、绝不去匹配文本取到后还要去除空格因为旧版本构建会以字节对形式打印十六进制install_script.rs。关闭延迟扩展setlocal DisableDelayedExpansion贯穿全程。cmd 开启延迟扩展时会对已替换的行再做一轮展开路径里任何一个!项目目录、MISE_INSTALL_PATH、TEMP都可能含都会被悄悄吞掉导致脚本读写与给定不同的路径。源码注释记录了对真实 cmd.exe 的实测对比install_script.rs。变量命名避坑cmd 变量名大小写不敏感所以脚本特意用resolved_version而非mise_version保存解析结果——一个叫mise_version的本地变量实际上就是MISE_VERSION会覆盖调用者的值。路径兼容性的严格校验由于.cmd可能在任意 Windows 机器上运行生成阶段就对--localized-dir做了严格检查目录名中含 Windows 禁止字符 : | ? *会直接拒绝生成如C:foo在 Linux 上是普通目录、在 Windows 上是驱动器相对路径%project_dir%\C:foo根本不是合法路径不带--windows时同一目录名则完全没问题。e2e 测试验证了拒绝与放行两种情形e2e 测试。是否绝对路径按 Windows 规则判定C:\tools、\\server\share是绝对路径原样保留C:foo驱动器相对与普通名字则拼接到%project_dir%下。%需要写成%%才能在set var...行中原样落地否则会被当变量展开cmd_escapeinstall_script.rs。若--write的目标文件名本身已以.cmd/.bat/.exe结尾则不再生成name.cmd.cmd并向用户明确提示install_script.rs。七、安全模型minisign 签名校验无论是 bash 脚本内嵌的 install.sh还是 Windows 启动器内嵌的校验和都在生成时完成签名验证因此运行时脚本只做纯字符串比较不携带任何密钥逻辑。校验实现位于 src/minisign.rs公钥读取仓库根目录 minisign.pub 的最后一行调用minisign_verify库完成PublicKey::from_base64→Signature::decode→verify全流程minisign.rs。这一设计保证了两件事生成者拿到的安装脚本/校验和文件来源可信官方渠道被劫持也无法注入恶意内容提交进仓库的包装脚本自身可被任何人审阅运行时不依赖网络信任未篡改则下载行为可预期。八、与mise generate bootstrap的兼容性命令更名后旧名继续可用但调用时会打印废弃警告源码在 generate/mod.rs 中通过deprecated_at!标记警告期到 2026.9.0、移除时间 2027.9.0。e2e 测试确认旧名生成的结构与新名一致e2e 测试因此 CI 中还在使用旧拼写的脚本不会立即失效但建议尽快迁移到mise generate install-script。九、测试覆盖行为即规格该命令的正确性由两层测试锁定单元测试#[cfg(test)] mod windows_bootstrap_tests位于 install_script.rs用仿真的SHASUMS256.txt验证校验和按架构精确匹配、缺失版本返回None而非借用别的版本哈希、.cmd同时携带两个架构校验和与生成标记、禁止字符目录被拒、绝对路径原样保留、%被转义为%%、延迟扩展绝不开启、默认安装路径落在bootstrap\下且保留旧位置回退等。端到端测试e2e/generate/test_generate_install_script真实执行mise generate install-script断言脚本包含exec -a $0 $MISE_INSTALL_PATH $、--windows与--write的依赖关系、.cmd中校验和与版本固定一致、MISE_INSTALL_PATH覆盖优先、缓存旧二进制复用、数据目录新默认路径、~前缀展开、本地化脚本脱离全局 PATH 独立运行等行为。十、完整落地建议把mise generate install-script接入项目的推荐流程生成脚本并提交进仓库mise generate install-script --write ./bin/mise --windows git add ./bin/mise ./bin/mise.cmd在 README 的快速开始中指导贡献者./bin/mise install # Linux / macOS .\bin\mise.cmd install # Windows之后所有需要 mise 环境的操作统一走./bin/mise run task或./bin/mise exec -- cmd保证贡献者环境与 CI 一致。若项目要求状态完全隔离例如多个相互独立的工具链工作区改用mise generate install-script --localize -w ./bin/mise数据与缓存将落在项目.mise/下可通过--localized-dir改位置。相关文档mise generate install-script 参考文档mise generate 命令族源码Dev Tools 使用总览mise 官方 minisign 公钥【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表