Mac 언어 툴체인 — mise로 Node·Python·Rust·Go 한 번에 관리
nvm·pyenv·rustup·goenv를 따로 깔지 말고 mise 하나로 — 프로젝트별 버전 자동 전환·shell 통합.
개발자 1년차에는 보통 nvm으로 Node를 깐다. 2년차에 pyenv를 추가한다. 3년차에 rustup·goenv·rbenv가 누적되고 .zshrc가 30줄 늘어난다. 각각 shell hook이 충돌하고 새 머신에서 똑같이 셋업하는 일이 짜증난다.
**mise (구 rtx)**는 이걸 단일 도구로 통합한다. asdf 호환, Rust 작성, 빠르고 단순. 본 가이드는 mise를 중심으로 Node·Python·Rust·Go·Ruby를 일관되게 관리하는 셋업.
TL;DR
- mise 1개 설치 → 모든 언어 버전 매니저 대체
- 프로젝트마다
.mise.toml또는.tool-versions로 버전 고정 - cd 시 자동 전환 — 별도 명령 불필요
mise install한 번이면 새 머신에서 모든 언어·버전 복원- nvm/pyenv/rustup 제거 권장 — 중복 안 좋음
사전 조건
- macOS 12+ + Homebrew (Mac 초기 셋업)
- (선택) 기존 nvm/pyenv 데이터 — 마이그레이션 섹션 참고
1. 왜 mise인가
통합 대상
- Node.js (nvm, n, fnm, volta 대체)
- Python (pyenv 대체)
- Rust (rustup 부분 대체 — 본격 Rust는 rustup 유지 권장)
- Go (goenv 대체)
- Ruby (rbenv, rvm 대체)
- Java (jenv 대체)
- 기타 — Elixir, Erlang, Lua, Bun, Deno, Terraform, kubectl, etc.
강점
- 빠름 — Rust 단일 바이너리. shim 없는 PATH-only 모드 가능
- asdf 호환 —
.tool-versions그대로 사용 - 자동 전환 — cd만 해도 버전 변경 (수동
use불필요) - 글로벌·프로젝트 분리 —
mise use --globalvsmise use
약점
- rustup 일부 기능 부족 — toolchain rust-stable + components(clippy, rustfmt 등)는 rustup이 더 매끄러움. mise는 Rust 한 버전 픽한 게 좋을 때
- 공식 도구가 아닌 언어 매니저 — 일부 corner case 차이 (예: Python의
python-build옵션)
2. 설치
brew install miseshell 통합 (.zshrc 끝에):
eval "$(mise activate zsh)"새 터미널 → mise --version 확인.
bash 사용자:
mise activate bash. fish는mise activate fish.
3. 첫 사용 — Node 설치
# 가능한 버전 보기
mise ls-remote node
# 글로벌 설치
mise use --global node@22
# 또는 LTS
mise use --global node@lts확인:
node --version # v22.x
which node # ~/.local/share/mise/installs/node/22/bin/node4. 프로젝트별 버전 고정
프로젝트 폴더에서:
cd ~/work/my-app
mise use node@20.18.0 # 이 프로젝트만 Node 20.18.0생성된 .mise.toml:
[tools]
node = "20.18.0"또는 asdf 호환 형식 (.tool-versions):
node 20.18.0
python 3.12.7
.mise.toml이 우선..tool-versions는 asdf 호환·기존 프로젝트 마이그레이션 시.
자동 전환
cd 만 하면 mise가 .mise.toml을 발견하고 해당 버전을 활성화. node --version이 즉시 변경.
5. 멀티 언어 프로젝트
cd ~/work/fullstack
mise use node@22
mise use python@3.12
mise use go@1.23.mise.toml:
[tools]
node = "22"
python = "3.12"
go = "1.23"mise install — 누락된 버전 모두 한 번에 설치.
6. 글로벌 vs 로컬
mise use --global node@22 # ~/.config/mise/config.toml
mise use node@20 # 현재 디렉토리 .mise.toml우선순위 (높은 순):
- 환경변수
MISE_NODE_VERSION - 현재 디렉토리부터 위로 탐색되는
.mise.toml/.tool-versions - 글로벌
~/.config/mise/config.toml - 시스템 PATH의 default
7. 자주 쓰는 명령
# 모든 설치된 버전
mise ls
# 특정 도구의 모든 가능한 원격 버전
mise ls-remote python
# 프로젝트 lock 파일 기반 일괄 설치
mise install
# 특정 도구 업그레이드
mise upgrade node
# 도구 제거
mise uninstall node@18
# 환경 inspect
mise env
# 임시 실행
mise exec -- node --version
mise x -- npm test8. .envrc / direnv 통합
mise 0.30+부터 .mise.toml에 환경변수 직접:
[tools]
node = "22"
[env]
DATABASE_URL = "postgresql://localhost/myapp"
NODE_ENV = "development"direnv 별도 셋업 불필요 (mise가 cd 시 env 자동 export).
9. nvm/pyenv에서 마이그레이션
nvm → mise
# 현재 사용 중인 Node 버전 확인
nvm current
# v20.18.0
# mise에 같은 버전 설치
mise use --global node@20.18.0
# nvm 제거
brew uninstall nvm
# 또는
rm -rf ~/.nvm
# .zshrc 에서 nvm hook 제거
# (export NVM_DIR=... 같은 줄 삭제)pyenv → mise
pyenv versions
# 사용 중인 버전 확인
mise use --global python@3.12.7
# pyenv 제거
brew uninstall pyenv pyenv-virtualenv
rm -rf ~/.pyenv
# .zshrc 정리asdf → mise
# 기존 .tool-versions 그대로 사용
brew uninstall asdf
brew install mise
# .zshrc 의 asdf 줄을 mise 줄로 교체mise는 asdf 플러그인 대부분 호환. mise plugins ls-remote 로 확인.
10. Rust — mise vs rustup
Rust는 toolchain 개념(stable, nightly)과 components(clippy, rustfmt, rust-analyzer)가 강력해서 rustup이 압도적. mise는 Rust 한 버전을 픽해서 쓰는 경우만.
권장:
- Rust 본격 개발: rustup 유지. mise는 다른 언어만
- Rust 가끔만: mise로 stable 한 버전 충분
rustup 유지 시:
brew install rustup-init
rustup-init -y
# .zshrc 에서 rustup 환경 자동 활성화검증
mise --version— 설치 확인cd ~/work/proj-a && node --version→ 프로젝트 A 버전cd ~/work/proj-b && node --version→ 프로젝트 B 버전 (자동 전환)mise install—.mise.toml기반 누락 버전 설치- 새 머신에서
brew install mise && mise install→ 모든 언어 버전 복원
트러블슈팅
command not found: node 같은 에러
eval "$(mise activate zsh)"가.zshrc에 있는지- 새 터미널을 열어야 적용.
. ~/.zshrc또는 새 탭
자동 전환이 안 됨
.mise.toml또는.tool-versions가 프로젝트 루트에 있는지mise current로 현재 어떤 버전이 활성화됐는지 확인- 신뢰 prompt — 새 디렉토리 진입 시
mise trust한 번
Python pip install 시 권한 에러
mise의 Python은 user-local. 시스템 Python과 혼동 X. 가상환경 사용 권장:
python -m venv .venv
source .venv/bin/activate
pip install ...Node native 모듈 빌드 실패
- mise Node는 prebuilt 사용 →
npm rebuild또는node-gyp명시적 - macOS Xcode CLT 필요:
xcode-select --install
asdf 시절 플러그인 누락
일부 asdf 커뮤니티 플러그인 (asdf-foo)은 mise core 도구에 없을 수 있음. mise plugins install foo https://github.com/... 로 수동 추가.
비결정적 빌드
.mise.toml에 정확한 버전 명시 (node = "20.18.0" not "20"). 팀 협업 시 lock 효과.
참고
- Mac 초기 셋업 — Homebrew 사전 셋업
- dotfiles 관리 —
.mise.toml도 chezmoi 관리 가능 - mise 공식
- asdf 공식 — 비교 대상
- rustup — Rust 본격 도구
변경 이력
- 2026-05-12: 첫 작성. mise 통합 + 프로젝트별 자동 전환 + nvm/pyenv 마이그레이션 + Rust 예외 + 트러블슈팅 6종.