如何编译goproxy
社长的goproxy版本定格在了r1624,如果想要写一个自己的版本,暂时叫它r1625,上一篇我们已经讲述了如何从源代码安装go语言,这一篇来讲讲如何编译goproxy。
goproxy的README里有一个howToBuild的wiki,可以拿来参考。
由于社长停止了goproxy项目,所以我把goproxy相关的都fork到自己的github下面,方便自己编译。goproxy对以下golang周边库进行了修改
我们得从golang工具链开始编译,假设以下步骤的工作目录位于~/workspace/goproxy/r1625/
,系统为macos,首先确保系统安装了如下工具
awk/git/tar/bzip2/xz/7za/gcc/make/sha1sum/gtimeout/xargs
,检查命令
1 | for CMD in curl awk git tar bzip2 xz 7za gcc sha1sum gtimeout xargs |
没有的话,可以用homebrew安装。像7za和sha1sum的安装包名称和命令不同,gtimeout比较特殊,linux下的安装包叫timeout,mac下叫gtimeout。
1 | # 7za |
假设我们已经按照上一篇安装好了go1.10.1,下一步就要编译phuslu版本的go源程序。
1 | export BUILD_ROOT=~/workspace/goproxy/r1625 |
$GOROOT
环境变量是go语言的工具链根目录,也就是刚才编译的go语言目录。$GOPATH
是用来存放第三方安装包的目录,比方说github上的包。
整个编译过程可能会出现以下几种错误情况:
1. undefined: sys.TheVersion
这是由于使用了默认的go语言工具链,没有采用phuslu的版本。
2. $GOROOT_BOOTSTRAP must not be set to $GOROOT
请先安装go1.4.3,再编译phuslu版本的go语言。
3. unrecognized import path “github.com/xxx/xxx”
执行命令
1 | go get github.com/xxx/xxx |
本质是git来下载对应目录的文件,自动创建目录,
4. unrecognized import path “golang.org/x/net/http2”
由于golang.org被墙,git无法直接下载安装包,这里有两个方法。
其一,给git配置代理
1 | # 查看git配置 |
这种情况要求有代理软件,并且设置为全局代理。
其二,翻墙上github下载,在$GOPATH
的src
目录下创建golang.org/x
目录,然后将github下载下来的包解压,拷贝到golang.org/x
目录下。
5. not enough arguments in call to net.DialTCPContext
修改$GOPATH/github.com/ocdman/goproxy/httpproxy/helpers/dialer2.go
文件,将DialTCPContext(ctx, network, nil, raddr)
改为DialTCPContext(ctx, network, nil, raddr, nil)
。
6. unknown field ‘RequestConnectionIDTruncation’ in struct literal of type quic.Config
修改$GOPATH/github.com/ocdman/goproxy/httpproxy/helpers/dialer2.go
以及$GOPATH/github.com/ocdman/goproxy/httpproxy/proxy/quic.go
文件,将出现过RequestConnectionIDTruncation
的地方都替换为RequestConnectionIDOmission
。
7. local import “./curve25519” in non-local package
虽然go语言支持相对路径,但是并不推荐这么做。只有在$GOPATH
中找不到时,才会使用相对路径去查找,所以还是老老实实的写全路径吧。将./curve25519
修改为github.com/google/boringssl/ssl/test/runner/curve25519
。
8. code in directory /home/user/gopath/src/github.com/google/boringssl/ssl/test/runner/curve25519 expects import “golang.org/x/crypto/curve25519”
虽然上一个问题不报错了,但是再编译的时候又报了这个错,按照提示将路径github.com/google/boringssl/ssl/test/runner/curve25519
修改成golang.org/x/crypto/curve25519
。
9. unknown field ‘KeepAliveTimeout’ in struct literal of type h2quic.RoundTripper
这个错误是因为以前’github.com/phuslu/quic-go/h2quic/roundtrip.go’文件里有KeepAliveTimeout
字段,但是作者更新了这个文件,取消了这些字段,最新的包已经没有该字段了,而我们只要注释掉就可以了。
以上,是我在编译过程中碰到的问题,可能还会有别的,会不断补充。
总的来说,编译goproxy并不复杂,关键在于耐心,编译过程错误可能层出不穷,多看看错误提示,多思考,问题就会迎刃而解。