go modules
关于go的第三方包的依赖管理,项目小的时候还不觉得多麻烦,当项目越来越大,引入的第三方包越来越多的时候,这个时候问题就很头痛了,golang官方建议是一个项目一个GOPATH,但是鉴于很多人都不这么做(我也不这么做,因为麻烦),于是在go1.11的时候推出了这个go modules来解决依赖管理的问题。
使用
由于这个go modules和GOPATH可能是天生不和,如果配置了GOPATH的话,这个go modules是默认不开启的。
开启也很简单,只要在命令行中键入下面命令就行了。
export GO111MODULE=on # 开启GoModule特性
/etc/profile
export GO111MODULE=on
source /etc/profile
GO111MODULEonGo Modules$GOPATHvendorgo.modoffGo Modulesvendor$GOPATHautogo.mod$GOPATH/srcgo.modGo ModulesautoGO111MODULE
goproxy
golang.org/x/golang.org/x/golang.org/x/
A Global Proxy for Go Modules
使用
一般来说,goproxy是和go modules配合使用的。
首先要确保go modules是开启的,如果没有开启可以在命令行键入下面命令即可
export GO111MODULE=on
export GOPROXY=https://goproxy.io
/etc/profile
export GO111MODULE=on
export GOPROXY=https://goproxy.io
source /etc/profile
go.mod 和 go.sum介绍
go.mod
go.sum
go.sumgo.sum
go modules常用命令
go mod init: 初始化modules
go mod download: 下载依赖的module到本地cache
go mod edit: 编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
go mod graph: 以文本模式打印模块需求图
go mod tidy: 检查,删除错误或者不使用的modules,以及添加缺失的模块
go mod vendor: 生成vendor目录,将依赖复制到vendor目录下面
go mod verify: 验证依赖是否正确
go mod why: 解释为什么需要依赖
go list -m: 查看主模块的路径
go list -m -f={{.Dir}}: 查看主模块的根目录
go list -m all: 查看当前的依赖和版本信息
goland ide下使用go modules
vgovgo
关于在goland下要使用go modules,本菜鸡实在绕了很久,由于go modules出来也不久,虽说网上也有部分博客在教怎么用goland去用go modules,但是有一点很重要,在大部分博客中也没指出,就是关于goland的版本是否支持go modules这个新功能,这个问题实在是有点坑,相信不少人用的是goland2017或goland2018.1.3版本,这就有个问题,这些旧版本不支持快速使用go modules来包依赖管理,所以这里建议使用goland2019.1这个比较新的版本。
下面是配置流程:
在设置页面里,根据下图来配置就可以了
还有一种是新建项目时就想使用go modules,那么可以根据下面的图来配置,而这种的话,新建时就会在项目根目录下自动创建一个 go.mod 文件
接下来就以新建项目的这种情况来介绍怎么在goland下使用go modules
先创建一个项目,在创建页面的时候就选择"Go Modules(vgo)“这个选项,强烈建议在"Proxy"这一栏填上"https://goproxy.io”,毕竟墙的存在。
go.mod
module testModuleProject // 模块名,默认使用项目名。
go 1.12 // 当前go的版本
main.go$GOPATH/src/github.com/GO111MODULE =ongo.modSync package of testModuleProjectgo mod download
go.sumgo.modv1.2.0
requirereplaceexcluderequirereplaceexclude
$GOPATH/pkg/mod/
题外话
在https://goframe.org/prepare/vendor里看到的关于go modules的版本选择算法的简单介绍
版本选择算法
当项目中存在同一个第三方包依赖,并且依赖版本不一致时,Go Modules使用的“最小版本选择算法”(The minimal version selection algorithm: https://github.com/golang/go/wiki/Modules#version-selection )。
例如,如果您的模块依赖于具有require D v1.0.0的模块A,并且您的模块还依赖于具有require D v1.1.1的模块B,则最小版本选择将会选择D的v1.1.1版本用以构建(使用最高版本)。
十分有意思的是,这个算法名字叫“最小版本选择算法”,然而内容却是“最高版本选择算法”,若有纠结于此的同学欢迎向官方提issue:https://github.com/golang/go/issues
参考
https://goproxy.io/
https://goframe.org/prepare/gomodule
http://objcoding.com/2018/09/13/go-modules/
https://lfoder.github.io/2019/02/26/Go-Modules-go-mod-Goland-IDE%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/