devAlice
← Mac

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

  1. mise 1개 설치 → 모든 언어 버전 매니저 대체
  2. 프로젝트마다 .mise.toml 또는 .tool-versions 로 버전 고정
  3. cd 시 자동 전환 — 별도 명령 불필요
  4. mise install 한 번이면 새 머신에서 모든 언어·버전 복원
  5. 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 --global vs mise use

약점

  • rustup 일부 기능 부족 — toolchain rust-stable + components(clippy, rustfmt 등)는 rustup이 더 매끄러움. mise는 Rust 한 버전 픽한 게 좋을 때
  • 공식 도구가 아닌 언어 매니저 — 일부 corner case 차이 (예: Python의 python-build 옵션)

2. 설치

brew install mise

shell 통합 (.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/node

4. 프로젝트별 버전 고정

프로젝트 폴더에서:

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

우선순위 (높은 순):

  1. 환경변수 MISE_NODE_VERSION
  2. 현재 디렉토리부터 위로 탐색되는 .mise.toml / .tool-versions
  3. 글로벌 ~/.config/mise/config.toml
  4. 시스템 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 test

8. .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 환경 자동 활성화

검증

  1. mise --version — 설치 확인
  2. cd ~/work/proj-a && node --version → 프로젝트 A 버전
  3. cd ~/work/proj-b && node --version → 프로젝트 B 버전 (자동 전환)
  4. mise install.mise.toml 기반 누락 버전 설치
  5. 새 머신에서 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 효과.

참고

변경 이력

  • 2026-05-12: 첫 작성. mise 통합 + 프로젝트별 자동 전환 + nvm/pyenv 마이그레이션 + Rust 예외 + 트러블슈팅 6종.

댓글