mise

개발 도구 버전·환경 변수·태스크 러너를 하나로 합친 관리자

curl https://mise.run | sh

언어 런타임 버전 관리와 환경 변수 주입, 태스크 실행을 한 도구로 처리합니다. asdf 나 direnv, make 를 따로 쓰던 자리를 하나의 설정 파일로 대체하고 Rust 로 구현돼 전환 속도가 빠릅니다. 설치 스크립트 한 줄로 올립니다.

판단

이럴 때 씁니다

  • 프로젝트마다 node·python·terraform 버전이 달라 asdf 나 nvm 을 오가며 관리하고 있을 때
  • 디렉터리에 들어갈 때 환경 변수가 자동으로 잡히도록 direnv 를 따로 쓰고 있을 때
  • 새 체크아웃과 CI 잡이 동일한 도구 버전에서 출발하도록 한 파일로 고정하고 싶을 때
  • 빌드·테스트·린트 태스크를 Makefile 대신 프로젝트 설정에 함께 두고 싶을 때

이럴 땐 쓰지 마세요

  • 언어 하나만 쓰고 그 생태계의 공식 버전 관리자로 충분할 때
  • 셸을 건드리는 activate 훅을 조직 정책상 넣을 수 없을 때
  • 컨테이너 이미지에 도구 버전을 이미 고정해 두어 호스트 쪽 전환이 필요 없을 때

차별점

  • 도구 버전 관리·환경 변수 주입·태스크 실행을 mise.toml 한 파일로 통합해 asdf·direnv·make 조합을 대체합니다.
  • shim 대신 실제 경로를 쓰기 때문에 which 가 진짜 바이너리를 가리키고 전환 속도가 빠릅니다.
  • Rust 로 구현돼 셸 진입마다 붙는 오버헤드가 작습니다.
  • node·python·terraform 등 수백 종 레지스트리를 기본 제공하고 conda·vfox 백엔드도 함께 지원합니다.

워크플로

  1. 01설치 스크립트를 실행하면 ~/.local/bin/mise 에 설치되고 mise --version 으로 버전을 확인합니다.
  2. 02쓰는 셸에 맞춰 mise activate 훅을 rc 파일에 넣습니다. 이 단계를 건너뛰면 디렉터리 진입 시 자동 전환이 되지 않습니다.
  3. 03프로젝트 루트에서 mise use 로 도구 버전을 mise.toml 에 기록하고, 같은 파일의 [env] 와 [tasks] 에 환경 변수와 태스크를 정의합니다.
  4. 04mise install 로 팀원과 CI 가 동일한 버전을 내려받고, mise run 으로 정의한 태스크를 실행합니다.

주요 명령

명령설명
curl https://mise.run | sh~/.local/bin 에 mise 를 설치합니다.
eval "$(mise activate bash)"셸에 훅을 걸어 디렉터리별 도구·환경 변수 전환을 활성화합니다.
mise use node@22현재 프로젝트의 mise.toml 에 도구 버전을 기록하고 설치합니다.
mise installmise.toml 에 적힌 모든 도구를 설치합니다. CI 에서 씁니다.
mise run build[tasks] 에 정의한 태스크를 실행합니다.

함정

설치 전에 확인하세요

  • activate 훅을 셸 rc 에 넣지 않으면 설치만 되고 디렉터리별 자동 전환이 동작하지 않습니다.
  • shim 이 아니라 실제 경로를 PATH 에 넣는 방식이라 which node 가 진짜 경로를 가리킵니다. shim 을 전제로 짠 스크립트는 동작이 달라질 수 있습니다.
  • v2026.8.5 이전에는 ~/.config/mise 가 cwd 탐색 범위 밖일 때 config.local.toml 과 conf.d/*.toml 의 우선순위가 문서와 반대로 적용됐습니다. 전역 설정을 쓴다면 이 버전 이상으로 올려야 합니다.
  • preinstall·postinstall 훅의 상대 경로는 프로젝트 루트 기준으로 해석됩니다. 호출한 디렉터리가 필요하면 MISE_ORIGINAL_CWD 를 써야 합니다.

검토 메모

공식 문서·릴리스·공개 자료를 바탕으로 정리한 편집 메모입니다.

제가 보기에 이 도구의 값어치는 속도가 아니라 파일이 하나로 줄어드는 데 있습니다. asdf 와 direnv 와 Makefile 을 따로 관리하던 것을 mise.toml 하나로 모으면, 새 체크아웃과 CI 잡이 같은 지점에서 출발한다는 보장이 설정 파일 한 개로 끝납니다. shim 을 두지 않아 which node 가 진짜 경로를 가리키는 점도 문제가 터졌을 때 추적이 빨라져 실제로 도움이 됩니다. 갈아탈지 묻는다면 기준은 하나로 잡겠습니다. 관리하는 언어가 둘 이상이면 권하고, 하나뿐이라면 그 생태계 공식 도구로 충분합니다.

다만 드롭인 대체라는 오래된 소개말을 믿고 넘어가면 곤란합니다. 공식 문서가 두 프로젝트는 초기의 호환 관계에서 점점 갈라졌고 asdf 가 추가한 명령이 기존 mise 명령과 충돌해 이제 모든 플러그인이 동작하지는 않는다고 직접 밝힙니다. 그래서 마이그레이션 계획에는 쓰던 플러그인 목록을 먼저 대조하는 단계를 넣으시길 권합니다. direnv 를 당분간 함께 두려는 경우도 마찬가지입니다. 둘 다 훅 전후의 환경 변수를 비교하는 방식이라 서로 간섭할 수 있다고 문서가 경고하므로, 병용보다 한쪽으로 정리하는 편이 낫다고 봅니다.

가장 놓치기 쉬운 함정은 셸 밖에 있다고 생각합니다. asdf 와 direnv 에서 넘어온 한 이전기는 전역과 다른 Ruby 버전을 쓰는 저장소에서 Emacs 의 ruby-lsp 가 붙지 않는 문제를 겪었다고 적습니다. 저는 이것을 Emacs 만의 사건으로 읽지 않습니다. activate 훅을 거치지 않고 뜨는 프로세스라면 무엇이든 같은 증상이 나옵니다. 에디터, GUI 에서 띄운 터미널, 데스크톱 런처로 실행한 도구가 전부 후보입니다. 셸에서는 멀쩡한데 에디터에서만 버전이 어긋난다면, mise 설정을 뒤지기 전에 그 프로세스가 훅을 거쳤는지부터 보시는 편이 빠릅니다.

비교

asdf 가 버전 관리만, direnv 가 환경 변수만 담당하던 자리를 mise 는 태스크 러너까지 묶어 한 파일로 처리합니다. shim 을 두지 않아 실행 경로가 투명하고 Rust 구현이라 셸 진입 비용이 작습니다. 언어 하나만 쓰는 프로젝트라면 그 생태계 공식 도구로도 충분합니다.

최근 변경

v2026.8.14는 버그 수정 위주의 작은 릴리스로, aube 기반 npm 설치가 도구별 설치 디렉터리에 불필요한 .npmrc를 남기던 문제와 node-gyp를 호출하는 install 스크립트가 'no tasks defined' 오류로 실패하던 문제를 고쳤습니다. 압축 해제가 실패했을 때 임시 디렉터리가 영구히 남는 문제와, Windows에서 mise prune --configs가 대상이 사라진 config 링크를 지우지 못하던 문제도 함께 수정됐습니다.