Some years ago I discovered a little tool with a huge potential. I started using it and since then it proved useful in so many ways it’s now a mandatory tool in my toolset.

This tool is asdf. asdf is a CLI tool version manager. You may already be using multiple ones (rbenv, nvm, goenv to name a few) to manage versions of programming language tooling and accessories.

Having multiple tools for this purposes creates a series of disadvantages:

  • setting up your workstation is more painful (multiple tools to install, multiple versions to manage); this become more complex when you work in a team and want to provide a great onboarding experience
  • adopting a new tool force you to first search for a dedicated version manager, then install the tool (you may go without one, but that’s going to bite your future self)
  • how to share the same version in all environments, in particular dev and CI? Was that file .go-version, .golang-version? Each tool uses it’s own convention, sometimes they align but having a consistent experience is not in their DNA;
  • what’s the command again? Each tool may have different CLI commands, making switching between them a pain; this may happen more easily if you’re in a team;
  • remember the Good Old Times™ of “spaces VS tabs”? Well, why start a 🔥 war around which tool to use?

Let’s summarise why asdf is ground breaking:

  • helps developer onboarding across a wide set of tool;
  • helps team collaborating;
  • removes useless discussion drive by preference;
  • has a consistent UI.

Would that be enough? NO 😜

It delivers more:

  • creating plugins is so easy you can just add whatever you want (I did it here, here, here and here);
  • creating plugins is most probably not needed because what you need is already available; asdf-community has 60 repositories (so around 60 plugins), just a asdf plugin-add away;
  • are we forgetting the CI? Hell no! Note that this only works if you are using GitHub Actions, but if that’s the case there are actions ready to be used.

In case you don’t want to use the install action provided by the asdf community because it does not leverages other optimized setup actions, I developed an action that parses the .tool-versions file extracting each tool version so they can then be reused in other actions. No asdf needed!
This action is available here.

If you reached this line, STOP right here and go install asdf.