asdf — Gerencie múltiplas versões com apenas uma ferramenta

Jonathan J Nefoussi
TOTVS Developers
Published in
5 min readOct 10, 2022

Atualmente não é incomum que Engenheiros de Software estejam lidando com diversas tecnologias simultaneamente, desde a criação de novos projetos até o processo de sustenção de código legado.

Hoje em dia a maioria das tecnologias possuem algum mecanismo para auxiliar no processo de executarmos múltiplas versões, como o nvm para nodejs, pyenv para python, entre outros. No entanto, mesmo que ambas tenham o mesmo objetivo, vamos acabar nos deparando com formas específicas de cada ferramenta para o processo de gestão dessas versões, seja pela forma de realizar a configuração ou pela utilização da ferramenta propriamente dita.

Para solucionar esse problema surgiu o asdf, uma ferramenta capaz de gerenciar múltiplas tecnologias através de uma única Interface de Linha de Comando (CLI).

asdf core e plugins

O asdf é composto por duas partes: core e plugins:

o core é a estrutura do asdf , com uma lista bastante pequena de funcionalidades, mas que podem facilitar muitos fluxos de trabalho.

Os plugins são os recursos disponíveis para gerenciamento de cada tecnologia compatível com ele.

Para demostrar como utilizar o asdf para realizar o gerenciamento de versões em nossos projetos, vamos seguir um exemplo utilizando python e nodejs. No entanto, vale lembra que o asdf é compatível com mais de 500 tecnologias e você pode ver essa lista completa neste repositório do GitHub.

Instalação do asdf core

O primeiro passo é acessar a documentação do asdf e realizar o processo de instalação de acordo com o sistema operacional (macOS ou linux) e o shell que você utiliza.

Instalação dos plugins para python e nodejs

O segundo passo é instalar os plugins desejados e, com base no nosso exemplo, vamos instalar respectivamente o plugin do python e do nodejs, conforme abaixo.

Neste momento, após a instalação dos plugins vamos executar o comando asdf list no terminal e como poderemos observar, apenas os plugins foram instalados. Agora é necessário instalar a versão desejada para cada tecnologia.

Para instalar uma versão, execute o comando asdf install plugin_name optional_subset

plugin_name: nome do plugin
optional_subset: versão desejada, podendo utilizar latest para instalar a versão mais recente disponível

Neste caso, vamos instalar a versão mais recente com os comandos asdf install python latest e asdf install nodejs latest e com isso podemos executar novamente o comandoasdf list para obter o resultado abaixo:

Agora vamos atribuir essas versões como a versão global de cada tecnologia utilizando os comandos asdf global python latest e asdf global nodejs latest. Após isso já podemos perceber que ambas as tecnologias estão configuradas corretamente e prontas para utilizarmos.

Utilizando o asdf

Para começar a testar, deixamos este repositório preparado com os exemplos.

Se você preferir, basta criar apenas um diretório na sua máquina e criar 4 arquivos, conforme os exemplos abaixo:

exemplo do uso da função print na sintaxe compatível com python 2
exemplo do uso da função print na sintaxe compatível com python 3
exemplo de uma requisição get feita com o novo recurso fetch disponibilizado na versão 18 do nodejs
exemplo de uma requisição get feita com o módulo https do nodejs

Vamos executar o script python3sample.py e posteriormente o script python2sample.py . No caso da segundo script, o interpretador irá nos retornar um erro de sintaxe informando que houve ausência de parênteses no uso da função print.

O erro apresentando ocorre porque configuramos a versão 3 do python como a versão global e, a partir dela, não é mais possível utilizar a função print sem que os parâmetros sejam passados entre parênteses.

Para permitir a execução desse script, vamos instalar a versão 2.7, que é compatível com essa sintaxe, e configurá-la como a versão padrão, mas desta vez no escopo local, ao invés de globalmente como fizemos anteriormente. Para isso, basta executarmos os comandos asdf install python 2.7.18 e asdf local python 2.7.18 . Feito isso, podemos executar novamente o script python2sample.py

Como podemos observar, agora dentro do escopo do diretório que estamos a versão do python configurada é a 2.7, porém globalmente continuamos com a versão 3 como a versão padrão.

Uma das grandes vantagens do asdf, além da facilidade de utilização é que a estrutura de comandos é a mesma para todas as tecnologias compatíveis. Vamos executar o exemplo nodejs18sample.js, depois instalar a versão 16 do nodejs com o comando asdf install nodejs 16.17.1 , configurá-la como a versão local e tentar executar o script novamente.

É possível identificar que ao executar o script nodejs18sample.js , após configurar o escopo local como a versão 16, um erro de referência é apresentado. Isso está ocorrendo porque a função fetch é uma funcionalidade que passou a existir de forma nativa apenas na versão 18.

Neste caso, podemos executar o script nodejs16sample.js pois o mesmo foi implementado utilizando o recurso de https compatível com a versão 16.

Para finalizar, uma outra funcionalidade bastante útil que vale a pena conhecer é o asdf reshim plugin_name optional_subset. Por padrão, as estruturas são criadas pelos plugins durante a sua instalação, porém existem ferramentas como o npm CLI que permite que você realize instalação de pacotes globais. Mas, caso algum pacote não seja encontrado, basta executar o asdf reshim para que o asdf recalcule todos os recursos do plugin e assim funcione normalmente.

Conclusão

O asdf é uma ferramenta simples e muito útil, uma de suas limitações é não ser compatível nativamente com Windows. Porém, podemos observar ganhos significativos de utilizar uma ferramenta que padronizou o processo de instalação e gerenciamento de versões.

Espero que tenham gostado deste artigo e aproveito para te convidar a aprender mais com os artigos aqui do TOTVS Developers e sinta-se à vontade para interagir conosco através dos comentários.

Resumo dos comandos

--

--