Go Modulesのproxyとsumdb

(2020-02-29)

Module Mirror and Checksum Database Launched - The Go Blog

Go1.13からデフォルトで使われるようになったGo Modulesのミラーとchecksumを返すサーバー。 Googleによって運営されている。

$ curl "https://proxy.golang.org/github.com/labstack/echo/v4/@v/v4.1.14.mod"
module github.com/labstack/echo/v4

go 1.12

require (
        github.com/dgrijalva/jwt-go v3.2.0+incompatible
        github.com/labstack/gommon v0.3.0
        github.com/mattn/go-colorable v0.1.4 // indirect
        github.com/mattn/go-isatty v0.0.11 // indirect
        github.com/stretchr/testify v1.4.0
        github.com/valyala/fasttemplate v1.1.0
        golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876
        golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
        golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 // indirect
        golang.org/x/text v0.3.2 // indirect
)

$ wget "https://proxy.golang.org/github.com/labstack/echo/v4/@v/v4.1.14.zip"

$ curl "https://index.golang.org/index?since=2020-02-28T09:00:00.000000Z&limit=5"
{"Path":"github.com/openebs/api","Version":"v0.0.0-20200228085622-f3442fff37bf","Timestamp":"2020-02-28T09:00:05.62813Z"}
{"Path":"github.com/dirkarnez/dirk-commons","Version":"v0.0.0-20200228090031-1926f326c678","Timestamp":"2020-02-28T09:00:50.00608Z"}
{"Path":"github.com/jfrog-solutiontest/food","Version":"v4.107.0+incompatible","Timestamp":"2020-02-28T09:01:10.76502Z"}
{"Path":"github.com/nexus49/dapr-components","Version":"v0.0.0-20200228090009-67e985bdc953","Timestamp":"2020-02-28T09:01:15.618406Z"}
{"Path":"github.com/Krajiyah/ble-sdk","Version":"v0.0.7-0.20200228090109-03b5ffe425a0","Timestamp":"2020-02-28T09:01:23.38344Z"}

$ curl "https://sum.golang.org/lookup/github.com/labstack/echo/[email protected]"
732868
github.com/labstack/echo/v4 v4.1.14 h1:h8XP66UfB3tUm+L3QPw7tmwAu3pJaA/nyfHPCcz46ic=
github.com/labstack/echo/v4 v4.1.14/go.mod h1:Q5KZ1vD3V5FEzjM79hjwVrC3ABr7F5IdM23bXQMRDGg=

go.sum database tree
823876
ZBYxqpUFH3ncXs339d5qBfgo3tHnWPr8D10JLtW4Jck=

— sum.golang.org Az3grhvh6SDXL4PTk3rZJCs2x9Bbgfz5u1PudLDRYcToGxRUazHb59qSrBx9GeniTj8AO7zSFKQyBNHS+13M4FcFMQo=

proxyを通すことでオリジナルのリポジトリが消えてビルドできなくなるのを回避でき、 コミット履歴を含まないコードを持って来るので高速化される。一度proxyに乗ったバージョンは取り下げられない。 また、sumに問い合わせることで、初回getで go.sum がなくてもコードの真正性を保証でき、 他のproxyを使ったとしてもセキュリティが担保される。

環境変数

GOPROXY / GOSUMDB で向き先を変えることができる。 例えば、GOPROXY をdirectのみにするとproxyは使われない。

$ go version
go version go1.13 darwin/azmd64

$ go env GOPROXY
https://proxy.golang.org,direct

$ go env GOSUMDB
sum.golang.org

$ go env -w GOPROXY=direct
$ go env -w GOSUMDB=off

また、 GOPRIVATE のパスに前方一致するmoduleはproxyおよびsumdbの対象外になる。 GONOPROXY / GONOSUMDB を設定すると別個にオーバーライドされる。

$ go env -w GOPRIVATE=*.example.com,*.example.net/foo

sumからアクセスできないprivateなmoduleをgo getしようとすると 410 Gone になってしまうので GOPRIVATE に入れる。

$ go get github.com/sambaiz/test-private-go-module
go: finding github.com/sambaiz/test-private-go-module latest
go: downloading github.com/sambaiz/test-private-go-module v0.0.0-20200301002106-c8098ddbacf5
verifying github.com/sambaiz/[email protected]: github.com/sambaiz/[email protected]: reading https://sum.golang.org/lookup/github.com/sambaiz/[email protected]: 410 Gone

$ go env -w GOPRIVATE=github.com/sambaiz/test-private-go-module
$ go get github.com/sambaiz/test-private-go-module