go install時に勝手に新しいgoがダウンロードされる?(Go Toolchains)

Go製のアプリをgo installで導入したところ新しいバージョンのgoが自動的にダウンロードされて使われました．これは何だろうと少し調べてみました．

go install でnostr clientのalgiaをインストールしました．途中でgo 1.23.4がダウンロードされています．

mattn/algia: A cli application for nostr

$ go install github.com/mattn/algia@latest
go: downloading github.com/mattn/algia v0.0.84
go: github.com/mattn/algia@v0.0.84 requires go >= 1.23.0; switching to go1.23.4
go: downloading go1.23.4 (linux/arm) (1)
go: downloading github.com/mdp/qrterminal/v3 v3.2.0
go: downloading github.com/nbd-wtf/go-nostr v0.38.1
go: downloading github.com/urfave/cli/v2 v2.27.4
go: downloading github.com/btcsuite/btcd/btcec/v2 v2.3.4
go: downloading github.com/btcsuite/btcd/btcutil v1.1.6
go: downloading github.com/gobwas/httphead v0.1.0
go: downloading github.com/gobwas/ws v1.4.0
go: downloading github.com/mailru/easyjson v0.7.7
go: downloading github.com/puzpuzpuz/xsync/v3 v3.4.0
go: downloading github.com/tidwall/gjson v1.18.0
go: downloading github.com/fiatjaf/eventstore v0.11.0
go: downloading golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
go: downloading github.com/graph-gophers/dataloader/v7 v7.1.0
go: downloading rsc.io/qr v0.2.0
go: downloading github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0
go: downloading github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.5
go: downloading github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1
go: downloading github.com/gobwas/pool v0.2.1
go: downloading github.com/josharian/intern v1.0.0
go: downloading github.com/tidwall/match v1.1.1
go: downloading github.com/tidwall/pretty v1.2.1
go: downloading github.com/fiatjaf/generic-ristretto v0.0.1
go: downloading github.com/decred/dcrd/crypto/blake256 v1.1.0
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/golang/glog v1.2.2

go 1.23.4がダウンロードされている

gup checkで確認すると今回のalgiaはgo1.23.4でbuildされていて，他のはgo1.22.1です．

$ gup check
check binary under $GOPATH/bin or $GOBIN
[1/8] github.com/mattn/algia (Already up-to-date: v0.0.84 / go1.23.4) (1)
[2/8] github.com/darkhz/bluetuith (current: v0.2.2, latest: v0.2.3 / go1.22.1)
[3/8] github.com/mattn/bsky (current: v0.0.61, latest: v0.0.67 / go1.22.1)
[4/8] github.com/bloznelis/typioca (current: v0.0.0-20240403160848-1c6a0ac60a1a, latest: v0.0.0-20241028092943-0f1ec70f7d95 / go1.22.1)
[5/8] github.com/mikuta0407/misskey-cli (current: v0.0.0-20230730142608-ab80e8e6583c, latest: v0.3.1 / current: go1.19.8, installed: go1.22.1)
[6/8] github.com/nao1215/gup (Already up-to-date: v0.27.5 / go1.22.1)
[7/8] github.com/maaslalani/nap (Already up-to-date: v0.1.1 / go1.22.1)
[8/8] github.com/sqshq/sampler (Already up-to-date: v1.1.0 / go1.22.1)

If you want to update binaries, run the following command.
$ gup update bluetuith bsky typioca misskey-cli

algiaだけgo1.23.4が使われている

インストールされているgoを確認するとgo1.22.1です．

$ which go
/usr/bin/go
$ go version
go version go1.22.1 linux/arm

$GOPATHの下を見るとgo1.23.4があります．

$ ~/go/pkg/mod/golang.org/toolchain\@v0.0.1-go1.23.4.linux-arm/bin/go version
go version go1.23.4 linux/arm
$ du -Hs ~/go/pkg/mod/golang.org/toolchain\@v0.0.1-go1.23.4.linux-arm
243424 /home/matoken/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.4.linux-arm

go.modのこの辺りが効いていそうです．

$ head go/pkg/mod/github.com/mattn/algia@v0.0.84/go.mod
module github.com/mattn/algia

go 1.23.0

toolchain go1.23.1

require (
github.com/fatih/color v1.17.0
github.com/mdp/qrterminal/v3 v3.2.0
github.com/nbd-wtf/go-nostr v0.38.1

これは何だろうとgo toolchainとかで検索してみるとgo 1.21からの機能で必要なバージョンのgoを指定することで自動的に必要なgoをダウンロードして使ってくれるようです．便利ですね．

Go Toolchains – The Go Programming Language

Sessions | Go Conference 2024 「Go1.21から導入されたGo Toolchainの仕組みをまるっと解説」

Go1.21から導入された Go Toolchainの仕組みをまるっと解説 – Speaker Deck

でも容量結構食うし今回の環境のようなRaspberry Pi環境ではちょっと辛い．クロスビルドとかするといいんでしょうがちょっとツールを試すだけだと面倒……．ビルド後に掃除する感じがいいんですかね．

環境

$ dpkg-query -W golang-1.19 golang-1.22 golang
golang:armhf 2:1.19~1
golang-1.19 1.19.8-2
golang-1.22 1.22.1-1~bpo12+1
$ lsb_release -dr
No LSB modules are available.
Description: Raspbian GNU/Linux 12 (bookworm)
Release: 12
$ arch
armv7l