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

https://juejin.im/post/5c949ee5f265da6116246410

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调用

  1. $ mkdir test && cd test
  2. package main

使用go mod init test命令,会在当前目录下面创建一个go.mod文件

  1. # philchia @ philchia in ~/test [22:36:31]

go.mod中声明了模块的名称和当前模块构建时使用的go版本

google.golang.org/grpc 这个包因为某些原因一般是直接下载不了的,这里我们借助设置 GOPROXY=https://goproxy.io 使用 go module的download protocol来通过一个代理来获取我们的依赖

  1. $ GO111MODULE=on GOPROXY=https://goproxy.io go get google.golang.org/grpc
  2. go: finding google.golang.org/grpc v1.19.0

这样我们的依赖就都下载好了,可以看到多了一个go.sum文件,go.mod文件的内容也发生了改变

  1. $ cat go.mod

尝试编译我们的main.go

  1. $ 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代理的存储

  1. $ pwd

创建一个.netrc文件,写入我们私有库的地址和用户名密码

  1. $ cd athens-netrc

启动 athens 容器

  1. 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 检查容器是否启动成功

  1. curl http://localhost:3000

配置使用我们本地的athens代理

  1. $ 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! 晓代码公众号



ft_authoradmin  ft_create_time2019-04-26 18:07
 ft_update_time2019-04-26 18:08