通常我们将golang项目直接放在 $GOPATH/src 目录下,所有 import 的包的路径也是相对于 GOPATH 的。我在开发 frp(一个可以用于穿透内网的反向代理工具)的时候就遇到一个比较小但是挺棘手的问题,需要使这个项目可以在任意目录里被编译,方便其他成员不需要做额外的操作就可以一同开发,这里分享一下解决的方法。

背景

frp 是我业余时间写的一个用于穿透内网的反向代理工具,可以将防火墙内或内网环境的机器对外暴露指定的服务,例如22端口提供ssh服务或者80端口提供一个临时的web测试环境。

$GOPATH/srcimport github.com/xxx/xxximport frp/xxx$GOPATH/src/frp/xxx
go get github.com/fatedier/frp$GOPATH/src/github.com/fatedier/frp

使用类似第三方包的引用方式

import github.com/fatedier/frp/xxx$GOPATH/src/github.com/fatedier/frp

注:不推荐使用 ./ ../ 等相对路径来引用内部包,这样管理和定位问题其实都不是很方便。

fatedier

比较tricky的做法,修改GOPATH

GOPATHsrc/frpimport frp/xxx
GOPATHGOPATH=`pwd`:${GOPATH}
$GOPATH/src