Goのモジュールを個別に更新する

特に問題なければ go get -u ./... で全て更新してしまうのが楽ですが、更新できないモジュールがある場合は個別に更新する必要があります。

go list -m -u all で全モジュールとその更新有無を確認できるため、 -f でgo getコマンドを出力するようにし、必要なものだけ実行すると楽です。

例えばgoplsはそのまま実行すると以下のようになりますが、

$ go list -m -u all
golang.org/x/tools/gopls
github.com/BurntSushi/toml v0.4.1
github.com/davecgh/go-spew v1.1.1
github.com/google/go-cmp v0.5.6
github.com/google/safehtml v0.0.2
github.com/jba/templatecheck v0.6.0
github.com/kr/pretty v0.1.0 [v0.3.0]
github.com/kr/pty v1.1.1 [v1.1.8]
github.com/kr/text v0.1.0 [v0.2.0]
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e
github.com/pmezard/go-difflib v1.0.0
github.com/rogpeppe/go-internal v1.8.0
github.com/sanity-io/litter v1.5.1
github.com/sergi/go-diff v1.1.0 [v1.2.0]
github.com/stretchr/objx v0.1.0 [v0.3.0]
github.com/stretchr/testify v1.4.0 [v1.7.0]
github.com/yuin/goldmark v1.4.1 [v1.4.4]
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 [v0.0.0-20211108221036-ceb1ce70b4fa]
golang.org/x/mod v0.5.1
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f [v0.0.0-20211112202133-69e39bad7dc2]
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 [v0.0.0-20211113001501-0c823b97ae02]
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 [v0.0.0-20210927222741-03fcf44c2211]
golang.org/x/text v0.3.7
golang.org/x/tools v0.1.7 => ../
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 [v1.0.0-20201130134442-10cb98267c6c]
gopkg.in/errgo.v2 v2.1.0
gopkg.in/yaml.v2 v2.2.4 [v2.4.0]
honnef.co/go/tools v0.2.1 [v0.2.2]
mvdan.cc/gofumpt v0.1.1 [v0.2.0]
mvdan.cc/xurls/v2 v2.3.0

更新があり、直接使っている(not .Indirect)モジュールのgo getコマンドを生成すると以下のようになります。

$ go list -m -u -f '{{if (and .Update (not .Indirect))}}go get {{.Path}}@{{.Update.Version}}{{end}}' all
go get github.com/sergi/go-diff@v1.2.0
go get golang.org/x/sys@v0.0.0-20211113001501-0c823b97ae02
go get honnef.co/go/tools@v0.2.2
go get mvdan.cc/gofumpt@v0.2.0