As Brad Fitzpatrick would say, Mage 1.3.0 is the best release of Mage ever! This comes quick on the heels of gophercon, so I have been motivated to move some interesting new features through. 1.2.4 added real support for go modules (though it needs some more polish). This release adds a feature that I think will become more useful as more projects use Mage.
As you may or may not know (it hasn’t been well advertised), it’s now extremely
easy to run multiple go versions side by side. You can
go get golang.org/dl/go1.xx for any version of go from 1.8 and up. It’ll drop a
binary on your system that you can then run
go1.xx download and it’ll download
and set up a new go environment for that version of go. From then on, you can
go1.xx build etc just like you do with the “go” binary.
This makes it super easy to work on different projects with different required versions of go support. I used to work at Canonical, and we were restricted to the versions of Go that shipped in the latest Ubuntu release, because our code was going to ship with that release, too, and it needed to build with the built-in go compiler. This meant that we were almost always behind the latest go version. Of course, go is backwards compatible, so you can build 1.6 compatible code with go 1.11…. but you can also accidentally introduce dependencies that don’t exist and/or don’t work in old versions.
Oh, we’re supposed to be talking about Mage? Yeah, so there’s a new flag for
Mage in 1.3.0:
-gocmd which lets you specify the binary to use to compile the
magefile binary. Thus, if the code your magefile imports needs an older version
of Go, you can specify it there, e.g.
mage -gocmd go1.8.3 build. This
literally just calls
go1.8.3 build to compile the magefile binary, rather than
go build. This means that you need that binary on your path (or specify the
full path), and it means that if you pass in something wacky (like grep or
something) that wacky things may happen.
One important change is that the version of go used to compile the magefile binary is now part of the hash that determines whether we need to recompile the binary. So, if you run the exact same magefile with two different versions of go, it’ll create two different files in your magefile cache. (yes, there’s a binary cache, see https://magefile.org/howitworks).
Also in this version, we now print out the version of Go used to compile Mage
itself when you run
mage -version. This is important because mage compiled
with < 1.11 does not play well with go modules. There’s also some more
debugging output showing versions of go being used when you run with -debug…
again, this can help figure out when you’re not running what you think you’re
Hope this is useful to some people. Please feel free to drop by the repo and make an issue if you have an idea of something that could make Mage even better.