The Go module proxy should be a very small thing. At least from the protocol it should be. But the Athens seems to over-interpret this feature. I tried to read its code. To be honest, no offense, I was lost in its file ocean from the beginning. It has quite a lot of directories, quite a lot of files, quite a lot of structs, and quite a lot of interfaces. Of course, it may be because my personal understanding is limited.

After all, in order to make it easier for everyone to build their own Go module proxy, I created Goproxy.

Now you can build your own Go module proxy in this way:

package main import ( "net/http" "github.com/goproxy/goproxy" ) func main() { http.ListenAndServe("localhost:8080", goproxy.New()) }

This is the dead simple way we are talking about, isn’t it?

In addition, Goproxy now supports multiple storage methods: