If you're not using mise as your version manager, you really should consider it.
It's become my primary way of installing things, only falling back to Homebrew when absolutely necessary.
Combined with chezmoi this keeps my tooling in sync across every environment I work in.
By default, it links binaries directly in the shell path instead of using shims, but also generates shims if you want to use them - they're kept in ~/.local/share/mise/shims/.
If you don't want to use the mise shell integration directly for some reason, it works with direnv. Here's a sample .envrc:
use miseThat's literally it.
It can manage the following as core plugins:
node- Node.jspython- Pythonruby- Rubygo- Gorust- Rustjava- Javabun- Bundeno- Denoelixir- Elixirerlang- Erlangswift- Swiftzig- Zig
Other languages are available through other backends. This is not an exhaustive list, just to give you a taste:
clojure- viaasdfcrystal- viaasdfandvfoxdart- viaasdfandvfoxelm- viaubiandasdfgroovy- viaasdfandvfoxhaskell- viaasdfjulia- viaasdfkotlin- viaasdfandvfoxlua- viaasdfnim- viaasdfocaml- viaasdfperl- viaaquaandasdfphp- viaasdfandvfoxpurescript- viaubiandasdfr- viaasdfscala- viaasdfandvfoxsolidity- viaubiandasdf
It also uses backends to support installation of tools - not just languages - from all kind of sources:
aqua- Deterministic package manager withcosign/slsavalidationasdf- Use anyasdfplugin withmisecargo- Rust tools, will usecargo-binstallif you have it (you can usemiseto install it, of course)dotnet- .NET toolsgem- Ruby toolsgo- Compile and fetch Go toolsnpm- Node.js tools, supports usingbuninsteadpipx- Self contained Python packages, supports usinguvxinsteadspm- Swift Package Managerubi- Fetch binaries from GitHub releasesvfox- Windows-compatible plugin system
It is also a task runner:
mise [task]- Run the task named[task]mise run [task]- Run the task named[task]- useful if your task name clashes with amisesubcommand
It can integrate itself with stuff nicely:
mise generate bootstrap- Generate a script to download and execute misemise generate config- Generate amise.tomlfile for your projectmise generate devcontainer- Generate a devcontainer configuration to execute misemise generate git-pre-commit- Generate a git pre-commit hook for your projectmise generate github-action- Generate a GitHub Action workflow filemise generate task-docs- Generate documentation for tasks in a projectmise generate task-stubs- Generate shims to run mise tasks
Finally, a pretty cool feature - import your tools from other version managers. You can even continue to use them:
mise sync node- Symlinks all Node.js tool versions from external tools (like nvm) into misemise sync python- Symlinks all Python tool versions from external tools (like pyenv) into misemise sync ruby- Symlinks all Ruby tool versions from external tools (like rbenv) into mise