设置环境参数:
镜像源:
七牛:Goproxy 中国 https://goproxy.cn
阿里: https://mirrors.aliyun.com/goproxy/
官方: < 全球 CDN 加速 https://goproxy.io/>
其他:jfrog 维护 https://gocenter.io
下载依赖设置:
// 在开启 GO111MODULE 之后就可以使用 go module 工具了,
// 也就是说在以后的开发中就没有必要在 GOPATH 中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。
go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
配置 Goland
在 GoLand 2019.3中使用 go module 需要进行两个设置:
1.Preferences -> Go -> Go Modules (vgo),勾选 Enable Go Modules (vgo) integration 以启用 Go Modules,并在 Proxy 输入框中输入 https://goproxy.cn 。如图所示:
2.Preferences -> Go -> GOPATH,勾选上 Index entire GOPATH 以索引整个 GOPATH,不然无法导入包。如图所示:
新建工程:
- 在该目录下通过 go mod init 命令,此命令会在当前目录中初始化和创建一个新的go.mod文件;
- 当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦;
- go mod init命令可以帮助我们自动创建。go mod init同时生成go.sum文件,go.sum是一个模块版本内容的校验值,用来验证当前缓存的模块。go.sum包含了直接依赖和间接依赖的包的信息,比go.mod要多一些。
- go.mod文件一旦创建后,它的内容将会被 go toolchain 全面掌控,go toolchain 会在各类命令执行时,比如go get、go build、go mod等修改和维护 go.mod 文件。
- go module 安装 package 的原则是先拉取最新的 release tag,若无 tag 则拉取最新的 commit,详见 Modules 官方 介绍。
go.mod文件介绍
go.mod文件只会在Module的根目录,包含go.mod文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀,go.mod文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。
go.mod文件用//注释,而不用/**/。文件的每行都有一条指令,由一个动作加上参数组成。例如:
module dubbo-server
go 1.15
require github.com/apache/dubbo-go v1.5.3
require github.com/apache/dubbo-go-hessian2 v1.7.0
require github.com/dubbogo/gost v1.9.2
replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
exclude github.com/emicklei/go-restful/v3 v3.0.0
相同动作的命令可以放到一个动词+括号组成的结构中,例如:
require (
github.com/apache/dubbo-go v1.5.3
github.com/apache/dubbo-go-hessian2 v1.7.0
github.com/dubbogo/gost v1.9.2
)
go.mod 提供了 go、module、require、replace 和 exclude 五个动作:
go: go版本号
module: 语句指定包的名字(路径);
require: 语句指定的依赖项模块;
replace: 语句可以替换依赖项模块;
exclude: 语句可以忽略依赖项模块。
go mod tidy
执行后就会发现已经帮我们自动引入了最后一次commit id对应的版本号
go mod常用命令
go mod init
用法:go mod init [module]。此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建,例如:
go mod init dubbo-server 或者 直接运行 go mod init
go mod download
用法:go mod download [-dir] [-json] [modules] 使用此命令来下载指定的模块,模块的格式可以根据主模块依赖的形式或者path@version形式指定。如果没有指定参数,此命令会将主模块下的所有依赖下载下来。
go mod download命令非常有用,主要用来预填充本地缓存或者计算Go模块代理的回答。默认情况下,下载错误会输出到标准输出,正常情况下没有任何输出。-json参数会以JSON的格式打印下载的模块对象,例如:
go mod download -json
下载模块放到了本地缓存,具体可以通过命令go env查看,其中环境变量GOCACHE就是缓存的地址,如果该文件夹的内容太大,可以通过命令go clean -cache。
go mod tidy
默认情况下,go不会移除go.mod文件中的无用依赖。所以当你的依赖中有些使用不到了,可以使用go mod tidy命令来清除它。
用法:go mod tidy [-v]它会添加缺失的模块以及移除不需要的模块。添加参数-v,例如go mod tidy -v可以将执行的信息,即移除的模块打印到标准输出。
go mod vendor
用法:go mod vendor [-v],此命令会将build阶段需要的所有依赖包放到主模块所在的vendor目录中,并且测试所有主模块的包。同理go mod vendor -v会将添加到vendor中的模块打印到标准输出。
例如:
go mod vendor -v
go mod verify
用法:go mod verify。此命令会检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查自从下载下来是否有修改。如果所有的模块都没有修改,那么会打印all modules verified,否则会打印变化的内容。
go list -m all
打印当前module的依赖包。也可以添加 -json 参数,例如: go list -m -json all
go mod graph
打印模块依赖图