Using go:generate to run tools over your Go application is super useful, but how can you know you’ve got the tool installed? Simply having something like:

//go:generate mockery --name=Provider --case=snake --with-expecter

would only work if you’ve already got mockery installed.

If the tool is a Go application in a public repository, not a problem. Simply run go install and it’s now on your dev machine:

$ go install
$ go generate ./...
$ go build

But what about your CI/CD pipeline? Sure you could add explicit steps to install the tool first, but we could do better by using go run instead:

//go:generate --name=Provider --case=snake --with-expecter

This saves you from worrying about whether the tools installed. If it is, great. If not, Go will install it for you.

Even better, this also works on your dev machine.