“ Golang team在二月末发布了1.12版本,而athens也在3月初发布了v0.3.0版本,新一代的go语言包管理生态体系初见雏形”
最近被glide折腾的生不如死,下载墙外的包的时候就像段誉的六脉神剑一样,时灵时不灵,恰好此时go 1.12发布并且背靠微软的 go module 代理实现 athens发布了0.3.0的更新,为了早日摆脱glide,特对go module和athens做了可用性调研。
01
—
go module
go 1.11 试验性的引入了go module的概念,初步解决了go语言包管理的难题,talk is cheap, show me the code.
我们新建一个项目 test,test创建了一个grpc客户端并做了一个简单的rpc调用
$ mkdir test && cd test
package main
使用go mod init test命令,会在当前目录下面创建一个go.mod文件
# philchia @ philchia in ~/test [22:36:31]
go.mod中声明了模块的名称和当前模块构建时使用的go版本
google.golang.org/grpc 这个包因为某些原因一般是直接下载不了的,这里我们借助设置 GOPROXY=https://goproxy.io 使用 go module的download protocol来通过一个代理来获取我们的依赖
$ GO111MODULE=on GOPROXY=https://goproxy.io go get google.golang.org/grpc
go: finding google.golang.org/grpc v1.19.0
这样我们的依赖就都下载好了,可以看到多了一个go.sum文件,go.mod文件的内容也发生了改变
$ cat go.mod
尝试编译我们的main.go
$ go build main.go
bingo! 编译成功
02
—
athens
使用 https://goproxy.io 这样公共的go module 代理固然可以解决墙外依赖包下载的问题,然而当我们的依赖是放在自建gitlab的私有库内,普通的 go module 代理是没有办法的,这里就要隆重介绍 athens,athens是一个有微软参与和贡献代码的开源go module代理服务。
athens实现了go module download protocol, 并且支持从私有库拉取包。利用docker,可以非常方便的创建一个athens代理服务器。
首先创建两个目录,分别用于存放.netrc文件和作为go module代理的存储
$ pwd
创建一个.netrc文件,写入我们私有库的地址和用户名密码
$ cd athens-netrc
启动 athens 容器
docker run -d -v /Users/goheart/athens-netrc:/root -v /Users/goheart/athens-storage:/var/lib/athens -e ATHENS_NETRC_PATH=/root/.netrc -e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens -e ATHENS_STORAGE_TYPE=disk --name athens-proxy --restart always -p 3000:3000 gomods/athens:latest
访问 http://localhost:3000 检查容器是否启动成功
curl http://localhost:3000
配置使用我们本地的athens代理
$ export GOPROXY=http://locaohost:3000
这样我们就可以使用代理服务器来导入私有库中的依赖了One more thing 在没有使用go module的时候,如果在github上fork别人的代码,你自己的分支代码里面的import path有时候会带有原代码库的代码path,使得go代码库对fork的支持很不好,有了gomodule之后,我们代码的import path可以不用包括hostname和github的username, 可以完美支持fork的代码库
本文来源:Go语言之心
关注和喜爱前沿&有趣开发技术,加入【Hello World!晓代码】
有疑问加站长微信联系(非本文作者)