<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>terminal on </title>
    <link>/tags/terminal/</link>
    <description>Recent content in terminal on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sun, 01 Nov 2026 21:20:00 +0800</lastBuildDate><atom:link href="/tags/terminal/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>用 mise 统一多语言多版本管理：从 SDKMAN 与 nvm 迁移</title>
      <link>/posts/mise-multilang-runtime-management/</link>
      <pubDate>Sun, 01 Nov 2026 21:20:00 +0800</pubDate>
      
      <guid>/posts/mise-multilang-runtime-management/</guid>
      <description>如果开发机上要同时跑 Java 后端、Node.js 前端、Python 脚本和一些 Go 命令行工具，终端配置通常会迅速变乱。每个技术生态都有一套专属的版本管理工具：Java 生态习惯用 SDKMAN，Node.js 生态离不开 nvm，Python 生态用 pyenv，遇到 Terraform 还要装个 tfenv。
各自管各自的时候问题不大，但全部塞进同一台机器，工具链割裂带来的麻烦就会集中爆发。
多工具并存的具体代价 专用版本管理工具堆叠在一起，日常最容易踩到三个问题。
首先是终端启动变慢。SDKMAN 和 nvm 依赖在 shell 启动时加载大段 Bash 脚本。SDKMAN 的 sdkman-init.sh 会向当前 shell 注入数十个函数和环境别名；nvm 同样会在启动时执行探测并定义拦截函数。把这两项放进 ~/.zshrc 后，新开一个终端标签页经常能感觉到肉眼可见的延迟。
其次是版本配置各自为政。一个包含后端服务与前端工程的仓库，根目录下往往同时并存 .sdkmanrc、.nvmrc、.python-version。不同工具监听目录切换的机制互不相通，有的需要手动确认，有的静默生效，很容易出现进入目录后 Node.js 切换了、Java 却还在用全局旧版本的环境漂移。
再者是非交互式脚本容易找不到命令。SDKMAN 等工具大量依赖 shell 函数分发，在 Makefile、cron 定时任务或 CI 脚本等非交互式子 shell 里，这些函数默认不会被加载。本地终端里敲 java 能跑，丢进子进程脚本就会报命令不存在或环境变量缺失。
mise 的核心设计：动态 PATH 替代 Shell 函数 mise 针对多运行时管理的痛点，在执行机制、配置文件与生态兼容三方面做了轻量化设计：
基于 Rust 的快速 PATH 注入 与 SDKMAN、nvm 动用复杂的 Bash 函数拦截不同，mise 本身是一个用 Rust 编写的独立二进制。接入 zsh 或 bash 时，它只挂载一个极简的 shell 钩子（如 zsh 的 chpwd 和 precmd）。</description>
    </item>
    
  </channel>
</rss>
