DEV Community

y-yagi
y-yagi

Posted on

Automatically change Go version with `gvm` and `zsh`

#go

gvm does not change Go version automatically. This is a little inconvenience when developing multiple projects that use different Go versions. Let's change Go version when moved to the directory of Go project like rbenv.

Get Go version

Normally, we don't have a file that described Go version(like .ruby-version, .node-version).
But since Go 1.12, go.mod includes Go version 1. This probably the same with the projects' Go version. Let's reuse this.

This can do as following with zsh.

_change_go_version() {
  if [ -f "go.mod" ]; then
    local version=(`grep -Po "^go \K([0-9\.]*)$" go.mod`)
    gvm use ${version}
  fi
}

Change Go version when directory changed

zsh provides some hook functions. One of them, chpwd executed whenever the current working directory is changed 2. This function can use inside zshrc. Let's call _change_go_version inside this function.

# .zshrc
chpwd()
{
  _change_go_version
}

As a result, autosomally call gvm use when moved directory that has the go.mod file. If you use another version manager, please change gvm use inside _change_go_version.

Have a nice day!

Top comments (0)