MISE - Gerenciando SDKs de maneira inteligente
Tags: programming, tools, java, programmers
Published: 2024-01-02 13:31:25

## O que é mise?

[mise](https://mise.jdx.dev/) além de uma série de placas de vídeo da NVIDIA, também é uma ferramente para gerenciamento de SDKs, com ele gerenciamos automaticamente versões, variáveis de ambiente, task runners, etc. Podemos usá-lo no lugar do [asdf-vm](https://asdf-vm.com/), [jenv](https://www.jenv.be/), [nvm](https://github.com/nvm-sh/nvm), [sdkman](https://sdkman.io/) e outras ferramentas, sim, ele substitui todas elas.

## Como instalar?

O processo de instalação do mise é bem simples, basta executarmos o seguinte comando, tanto para Linux quanto para MacOS

```sh
curl https://mise.jdx.dev/install.sh | sh
```
Agora o processo de ativação do mise varia conforme o tipo de shell que você utiliza. Por exemplo para ativarmos ele no `zsh` devemos usar da seguinte maneira:

```sh
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
```

Para bash:
```sh
echo 'eval "$(~/.local/share/mise/bin/mise activate bash)"' >> ~/.bashrc
```

Para fish:
```sh
echo '~/.local/share/mise/bin/mise activate fish | source' >> ~/.config/fish/config.fish
```

Para adicionarmos os shims devemos adiciona-los no PATH, com isso temos um maior suporte para IDEs como as da JetBrains e até mesmo o VSCode.

```
export PATH="$HOME/.local/share/mise/shims:$PATH"
```

## Plugins

Por padrão o mise já vem com plugins para Go, Java, NodeJS, Python e Ruby. Mas podemos instalar plugins com facilidade, por exemplo rodando o fcomando abaixo, adicionamos o plugin para Bun

```sh
mise plugin add bun
```

E com o seguinte comando conseguimos listar todas as versões de bun disponiveis.

```sh
mise ls-remote bun
```
Ps. Todos os plugins do `asdf` são compatíveis com o mise.

## Demonstração

Para usar de exemplo vou utilizar o JDK, que é com o que eu trabalho diariamente, e eu também utilizo como gerenciador de dependencias o [maven](https://maven.apache.org/), então irei instalar o plugin do Maven, do do Java não tem necessidade, pois faz parte do core do mise.

```sh
mise plugin add maven
```

Vou listar as versões do maven com

```sh
mise ls-remove maven
```
Vi que a última versão disponível é a `3.9.6` para isso eu instalo esta versão usando o comando.

```sh
mise install maven@3.9.6
```

E para configura-lo para o uso global uso o comando

```sh
mise global maven@3.9.6
```

Se eu for na minha home, eu encontro o seguinte arquivo `.tool-versions` com o seguinte conteudo.

```txt
maven  3.9.6
```

Agora vou listar todas as versões do Java usando os mesmos comandos, porém quero apenas os JDK que são opendjk.

```sh
mise ls-remote java@openjdk
```
Usando o comando desta maneira eu consigo filtrar a grande lista de JDKs disponíveis, se eu não adicionar o `@openjdk` ele ira listar todos os disponíveis, sendo Zulu, GraalVM, adopt, etc.

Usando o comando abaixo eu instalo a versão do java e configuro ele como o global em apenas uma linha comando.

```sh
mise install java@openjdk-21.0.1 && mise global java@openjdk-21.0.1 
```

Pronto usando os comandos
```sh
mvn --version
java --version
echo $JAVA_HOME
```

Tenho as seguintes saidas no terminal

```sh
❯ mvn --version
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: /home/pgjbz/.local/share/mise/installs/maven/3.9.6
Java version: 21.0.1, vendor: Oracle Corporation, runtime: /home/pgjbz/.local/share/mise/installs/java/openjdk-21.0.1
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "6.1.69-1-lts", arch: "amd64", family: "unix"
❯ java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-29)
OpenJDK 64-Bit Server VM (build 21.0.1+12-29, mixed mode, sharing)
❯ echo $JAVA_HOME
/home/pgjbz/.local/share/mise/installs/java/openjdk-21.0.1
```

Legal, mas até ai parece apenas um "apt", "pacman" da vida, porém configurando automaticamente variaveis de ambiente.

Agora vamos ao que é mais legal, usando este meu projeto https://github.com/pgjbz/twitch-loco-bot de 3 anos atrás, usando o Java 11, com o arquivo `.tool-versions` dentro dele, configurado com o `java openjdk-11.0.1`, podemos simplismente entrar no projeto e digitar o comando

```sh
mise install
```

Feito isso já temos o Java 11 instalado e configurado para este projeto.

Para verifircar-mos vamos usar os comandos.
```sh
❯ java --version
openjdk 11.0.1 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
❯ echo $JAVA_HOME
/home/pgjbz/.local/share/mise/installs/java/openjdk-11.0.1
```

Veja que a variável de ambiente trocou o seu valor, e agora, para voltar ao Java 21? Basta sairmos da pasta do projeto e podemos validar.

```sh
❯ java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-29)
OpenJDK 64-Bit Server VM (build 21.0.1+12-29, mixed mode, sharing)
❯ echo $JAVA_HOME
/home/pgjbz/.local/share/mise/installs/java/openjdk-21.0.1
```

Pronto, voltamos a configuração para o Java 21, isso vale para qualquer ferramenta, para go, node, deno, bun, ruby, ocaml, haskell, elixir, etc.

Com essa ferramenta podemos facilitar a padronização nos projetos para o time, sempre deixando tudo com as versões corretas.

Lembrando, o `mise` ira priorizar os arquivos `.tool-versions` da pasta atual, e caso não exista ele irá utilizar a global.