본문 바로가기
Tools2026년 8월 25일6분 읽기

mise — 개발 도구 버전을 하나로 관리하는 asdf 대안

YS
김영삼
조회 5
mise — 개발 도구 버전을 하나로 관리하는 asdf 대안

mise(예전 이름 rtx)는 프로젝트마다 다른 개발 도구 버전을 자동으로 전환해주는 통합 버전 관리자다. Node, Python, Go, Ruby, Java 같은 런타임을 한 도구로 관리하고, 폴더에 들어가는 순간 그 프로젝트에 맞는 버전으로 알아서 바꿔준다. nvm·pyenv·rbenv·asdf가 하던 일을 하나로 합쳤다고 보면 된다. Rust로 만들어져 빠르고, .tool-versionsmise.toml 파일 하나로 팀 전체가 같은 버전을 쓰게 만든다.

나는 오랫동안 nvm과 pyenv를 따로 썼는데, 셸 시작이 느려지고 프로젝트마다 버전을 수동으로 바꾸는 게 은근히 귀찮았다. mise로 갈아탄 뒤로는 이 두 가지 스트레스가 통째로 사라졌다.

왜 관리자를 하나로 합치나

런타임마다 관리자가 따로면 문제가 쌓인다. nvm은 셸 함수라 새 셸을 열 때마다 초기화 비용이 들고, pyenv는 pyenv대로, rbenv는 rbenv대로 설정이 제각각이다. 새 프로젝트에 합류하면 "이 언어들 버전 관리자 뭐뭐 깔아야 하지?"부터 헤맨다.

mise는 이걸 하나의 인터페이스로 통일한다. 명령도, 설정 파일도, 자동 전환 방식도 전부 동일하다. asdf가 먼저 이 아이디어를 냈지만 셸 스크립트라 느렸는데, mise는 Rust 네이티브 바이너리라 체감이 확실히 다르다.

설치와 첫 사용

# 설치 (macOS/Linux)
curl https://mise.run | sh

# 셸에 활성화 (bash 예시, ~/.bashrc에 추가)
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc

# 도구 설치하고 전역 기본값 지정
mise use --global node@22
mise use --global python@3.12

여기서 mise activate가 하는 일이 핵심이다. 이걸 셸에 걸어두면, 디렉터리를 옮길 때마다 mise가 해당 폴더의 설정 파일을 읽어 PATH를 그 프로젝트 버전으로 갈아끼운다. 사용자가 명령을 칠 필요가 없다.

프로젝트별 버전 고정

프로젝트 루트에서 mise use를 실행하면 그 폴더에 설정 파일이 생긴다. 이 파일을 git에 커밋하면, 팀원이 저장소를 받아 그 폴더에 들어가는 순간 자동으로 같은 버전이 쓰인다.

cd ~/work/my-api
mise use node@20.11 python@3.11

# 생성된 mise.toml
cat mise.toml
# [tools]
# node = "20.11"
# python = "3.11"

"내 컴퓨터에선 됐는데" 문제의 흔한 원인 하나가 런타임 버전 불일치인데, 이걸 커밋 한 번으로 봉인한다. 개인적으로는 이 팀 동기화 기능이 mise를 쓰는 가장 큰 이유다. 신규 입사자에게 "이 폴더 들어가면 알아서 세팅됨"이라고 말할 수 있는 게 생각보다 크다.

도구 관리를 넘어 — 환경변수와 태스크

mise를 단순 버전 관리자로만 쓰면 절반만 쓰는 거다. 같은 mise.toml에 환경변수와 프로젝트 태스크까지 담을 수 있다. direnv와 make의 역할 일부를 흡수한다.

[tools]
node = "22"

[env]
DATABASE_URL = "postgres://localhost/dev"
NODE_ENV = "development"

[tasks.dev]
run = "node server.js"

[tasks.test]
run = "vitest run"

이러면 그 폴더에 들어갈 때 환경변수가 자동으로 설정되고, mise run dev로 태스크를 실행한다. 프로젝트 하나에 필요한 런타임·환경·명령이 파일 한 곳에 모이니, README에 "이것도 하고 저것도 하세요"를 길게 적을 필요가 줄어든다.

asdf에서 넘어온다면

mise는 asdf의 .tool-versions 파일과 플러그인을 그대로 읽는다. 그래서 마이그레이션이 부드럽다. 아래 표로 대략의 대응 관계를 정리했다.

하고 싶은 일asdfmise
버전 설치asdf install node 22mise install node@22
프로젝트 버전 지정asdf local node 22mise use node@22
전역 기본값asdf global node 22mise use -g node@22
설치 목록asdf listmise ls

주의할 점 하나. mise는 shims 방식 대신 기본적으로 PATH를 직접 조작하는 방식을 쓴다. 이게 더 빠르고 투명하지만, 셸 통합(mise activate)이 없는 환경 — 예를 들어 일부 IDE나 cron — 에서는 도구를 못 찾을 수 있다. 그럴 땐 mise settings set experimental true 후 shims 경로를 PATH에 넣거나, 명령을 mise exec -- 로 감싸면 된다.

자주 묻는 질문

기존 nvm·pyenv를 지우고 mise만 써도 되나요?

됩니다. 오히려 그게 권장됩니다. nvm과 mise가 동시에 PATH를 건드리면 어느 쪽이 이겼는지 헷갈리는 문제가 생깁니다. mise로 옮긴 뒤에는 이전 관리자의 셸 초기화 라인을 .bashrc에서 제거하는 게 깔끔합니다.

mise가 asdf보다 나은 점이 정확히 뭔가요?

가장 큰 차이는 속도와 편의입니다. Rust 네이티브라 셸 시작과 버전 전환이 빠르고, 환경변수·태스크 관리까지 통합돼 있습니다. asdf 플러그인 호환성도 유지하므로 기능은 슈퍼셋에 가깝습니다.

CI에서도 쓸 수 있나요?

가능하고 잘 어울립니다. CI 스텝에서 mise를 설치하고 mise install만 실행하면 저장소의 mise.toml에 적힌 버전이 그대로 재현됩니다. 로컬과 CI의 런타임 버전을 한 파일로 일치시킬 수 있어 재현성이 좋아집니다.

도구를 못 찾는다는 에러가 나요.

대부분 셸 활성화가 안 됐거나 새 셸에 반영이 안 된 경우입니다. mise activate 라인이 셸 설정에 있는지 확인하고 셸을 다시 열어보세요. IDE나 cron처럼 셸을 안 거치는 환경에서는 mise exec로 명령을 감싸는 방법이 확실합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록