代码分享 将 dep 更换为 go mod

astaxie · 2020年02月16日 · 最后由 goproxy 回复于 2020年02月18日 · 1036 次阅读
本帖已被设为精华帖!

起因

之前一直在使用 dep 来管理项目, 最近碰到了两个恶心的事情, 就是安装 ali-oss-sdk 和 go-ethereum 客户端的时候超级慢,lantern 也是半废状态, 时断时连,go-ethereum 等了半个小时都没装上(开灯和关灯都试了), 最后 dep ensure 状态回家, 第二天上班才好。

正好在我的帖子中 @appleboy 给我留言说 [可以改用 go module 了] , 然后就试了下, 泪奔, 只能说太好用了。

结果就是我就将所有的项目全部用 module 替换了。

替换

这里记录下过程, 用我的博客来做示例。

这个 go mod 是 go 自带的, 替换起来非常简单, 正好我的 go 环境使用的是最 go1.12 , 配置起来很容易。

将原本的 dep 的配置删除

# 我已经将代码从 GOPATH 中改到 /www 目录了 现在可以脱离 GOPATH ,
# 代码也可以放在任意目录了
# 如果代码还在 GOPATH  就需要手动添加下面配置 不叫 Go 去自动识别
# export GO111MODULE=on
cd /www/mdblog

# 删除原本的 dep 的配置 这个我也不纠结了 原本 dep 对版本的控制就不太好
# 如果对使用的包版本有要求 稍后可以手动修改 go.mod 将版本改为指定的
rm -rf Gopkg.* vendor

配置 go mod

这个也非常简单,它初始化后会在 $GOPATH/pkg/mod 目录中将所有下载过的依赖包保存, 并且可以保存多个版本, 下次再使用已经下载过的版本依赖时, 不会再去网上下载, 应该算是个本地仓库的感觉吧。

# 初始化
go mod init

# 如果是一个新的项目 初始化的时候需要指定项目名称 如下面两个例子
# go mod init demoname
# go mod init github.com/astaxie/mdblog

现在就会在项目目录下生成一个 go.mod 文件, 并且当在当前项目目录下执行 go get , go build, go run 等命令的时候, 自动将依赖的包下载,同时将版本信息写入到 go.mod 中,还会生成一个新的 go.sum 详细的记录

就这么简单的将项目从 dep 转成 module 管理。

代理

换成 module 方式之后可以很方便的来使用代理了,例如可以使用 https://goproxy.io/ 代理, 里面有配置的说明。因为对于有一些https://golang.org/x/... 项目没办法下载,所以 proxy 就至关重要了,而且用了 proxy 下载速度搜搜的

Linux 下添加下面变量就可以生效

# Enable the go modules feature
export GO111MODULE=on
# Set the GOPROXY environment variable
export GOPROXY=https://goproxy.io,direct

这里有个坑, 如果使用了私有仓库, 这个代理是找不到的, 所以必须配置上第二个参数 direct

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
astaxie 将本帖设为了精华贴 02月17日 00:06

go mod 爽啊, goproxy 棒棒。

如果是 go 1.3 以上,针对私有仓库好像还要设置 GOPRIVATE

应该可以不删 vendor,gomod 初始化时可以根据 vendor.json 保留版本号。避免升了个不兼容版本。

smallfish1 回复

如果你有些仓库不想经过 代理,可以本地设置 GOPRIVATE 这个环境变量,不是必须的,可以根据自己情况进行设置哦

goproxy 回复

估计是出于隐私保护这样的设置

astaxie 回复

出于两方面的考虑:

  1. 防止 import path 泄露,保护隐私和安全
  2. 有些 private 库,尤其是公司内部的,你本地可以访问到,但是 proxy server 访问不到。
goproxy 回复

都是 private 库了, proxy server 很难能访问到的吧。

smallfish1 回复

嗯嗯 配置成下面这样就可以了:

export GOPROXY=https://goproxy.io,direct
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册