Howto Build an Old Golang Project

我开始使用 golang 的时候,就已经进入了 go mod 时代了。这个时候就不用和 GOPATH 做斗争了。所以对于 GOPATH 时代的项目没啥经验。

最近需要 debug 一个 consul 的古老版本 v1.2.4,项目显示支持 go 1.10+。这一定不能是支持 go mod 的版本了,我查了一下 GOPATH 似乎是在 1.17 正式 deprecate 的。所以似乎理论上 1.10 - 1.16 的版本都可以。

选新不选旧,我自然乐意用 1.16。另外幸运的是,人家这个项目还使用了 vendor 目录,也就是说依赖应该在这个库里面都有了。

GOPATH 时代,似乎 GOPATH 和 GOROOT 决定了 build 的时候依赖的查找路径。另外也会在 vendor 目录里面查找。这样三个地方组合来查找依赖。

如果没有 vendor 目录,就麻烦大了,需要使用 go get 来安装依赖,别看很多都是 github.com 上面的项目,也有可能在经过这么多年之后根本就没有考虑过对老旧版本 golang 的支持。例如你想要下载这个包的 v1 版本。而很可能下载到的是只支持最新 golang 版本的 v1 版本。他们不停的在更新这个 tag 指向的代码。这个时候就很难办。

对于我来说,就是在 home 建一个 project/src/github.com/hashicorp/consul 目录,然后把代码 clone 到 consul 目录下面。 然后就是 export GO111MODULE=off 显式关闭 go mod,并且设置 export GOPATH=~/project/ 。然后就可以执行 go build -o consul 了。

一些参考链接:

  1. https://github.com/golang/vscode-go/blob/master/docs/gopath.md
  2. https://github.com/google/oss-fuzz/issues/2878
  3. https://blog.gopheracademy.com/advent-2015/vendor-folder/