rsshの日記

あうああえおお おうおう いおう あいうう ああいあ うおいああいえ うああいあいあう うおお おおう ああいいあう

GoのModuleの落とし穴

golangのエンジニアが一度は陥る罠についてご紹介

githubのライブラリには気をつけろ!

みなさんgithubにあるライブラリを使っていると思います。でもちょっとまってください。もしかして、今見てるソースコードのまま使えると思ってませんか?

go mod init
go build main.go

なんてのはよくやると思います。最新のやつでええやんと思ってそのままビルドするアレです。
でも実はコレが罠です。

go mod initをするとgithubのmasterリポジトリから取ってきてくれるとみんな信じ込んでいますが、実はそうではないです。
リリースタグのついたバージョンがあればそれが使用されます。

つまりどういうことかと言うと

github.com

これを使ってみて下さい。リリースされているのでgo mod initgo buildを行うとv1.0.0がダウンロードされて使用されます。
それで何が問題かというと、実はこのv1.0.0はageの値が100で固定されているのです。最新のソースだとそれは修正されてますが、未リリースの状態です。
実際に使ってみるとおかしい事に気がつくかと思います。
みなさんも今使っているgithubのライブラリが自分の認識している通りのソースかどうか確認してみましょう。
$GOPATH/go/pkg/mod/以下に格納されているので見てみることをオススメします。

githubで見ているソースのバージョンにしたい!

もちろん僕もそう思ったので一応やり方はわかりました。

...
go 1.13

require github.com/rssh-jp/go-releasetest 4667d47

go.modの中身を↑の様に、自分の指定したいリビジョンに変更してgo buildすると指定したリビジョンのソースがダウンロードされて使用されます。
これで事なきを得ました。めでたしめでたし。

最後に

ただ、もっと素敵な、最新のリビジョンを指定できるような方法があるとも思っているので、golangに詳しい方、ぜひ教えて下さい!