升级Go新版本,用go.mod 摆脱GOPATH的包管理束缚吧!

·  阅读 2452

image.png

 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

使用 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语言之心

Go语言之心

关注和喜爱前沿&有趣开发技术,加入**【Hello World!晓代码】**

Hello World! 晓代码公众号

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改