如何编译goproxy

社长的goproxy版本定格在了r1624,如果想要写一个自己的版本,暂时叫它r1625,上一篇我们已经讲述了如何从源代码安装go语言,这一篇来讲讲如何编译goproxy。

goproxy的README里有一个howToBuild的wiki,可以拿来参考。

由于社长停止了goproxy项目,所以我把goproxy相关的都fork到自己的github下面,方便自己编译。goproxy对以下golang周边库进行了修改

  1. https://github.com/ocdman/go
  2. https://github.com/ocdman/net
  3. https://github.com/ocdman/glog

我们得从golang工具链开始编译,假设以下步骤的工作目录位于~/workspace/goproxy/r1625/,系统为macos,首先确保系统安装了如下工具

awk/git/tar/bzip2/xz/7za/gcc/make/sha1sum/gtimeout/xargs,检查命令

1
2
3
4
5
6
7
for CMD in curl awk git tar bzip2 xz 7za gcc sha1sum gtimeout xargs
do
if ! type -p ${CMD}; then
echo -e "\e[1;31mtool ${CMD} is not installed, abort.\e[0m"
exit 1
fi
done

没有的话,可以用homebrew安装。像7za和sha1sum的安装包名称和命令不同,gtimeout比较特殊,linux下的安装包叫timeout,mac下叫gtimeout。

1
2
3
4
5
6
7
8
# 7za
brew install p7zip
# sha1sum
brew install md5sha1sum
# linux下的安装包叫timeout,mac下叫gtimeout
brew install gtimeout
# 取个别名
alias timeout=gtimeout

假设我们已经按照上一篇安装好了go1.10.1,下一步就要编译phuslu版本的go源程序。

1
2
3
4
5
6
7
8
export BUILD_ROOT=~/workspace/goproxy/r1625
export GOROOT=${BUILD_ROOT}/go
export GOPATH=${BUILD_ROOT}/gopath

git clone --depth 1 https://github.com/ocdman/go
(cd go/src && bash ./make.bash)

export PATH=${BUILD_ROOT}/go/bin:$PATH

$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
2
3
4
5
6
7
8
9
10
11
12
# 查看git配置
git config -l
# 查看git全局配置
git config --global -l
# 添加全局http代理
git config --global http:proxy 127.0.0.1:8087
# 添加全局https代理
git config --global https:proxy 127.0.0.1:8087
# 删除全局http代理
git config --global --unset http:proxy
# 删除全局https代理
git config --global --unset https:proxy

这种情况要求有代理软件,并且设置为全局代理。

其二,翻墙上github下载,在$GOPATHsrc目录下创建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并不复杂,关键在于耐心,编译过程错误可能层出不穷,多看看错误提示,多思考,问题就会迎刃而解。

avatar

chilihotpot

You Are The JavaScript In My HTML