若不需要了解太深可按如下使用:
1. #cd 项目名 //进入项目
2. #go mod init //初始化项目
3. #ps //查看初始化效果
4. #go build //编译,拉取必要包
前导:
Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题。Go.mod其实就是一个Modules官方定义为:
Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件。
Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件。
go mod的使用:
golang的版本升大于1.11 GO111MODULE要设置合理
GO111MODULE有三个值:off, on和auto(默认值)。
1.GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或GOPATH模式来查找。
2.GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
3.GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。
这种情况下可以分为两种情形:
当前目录在GOPATH/src之外且该目录包含go.mod文件
当前文件在包含go.mod文件的目录下面。
Go mod 的命令使用help查看
go.mod如何在项目中的使用:
#cd xxx //进入项目
#go mod init //初始化项目
#ps
在当前目录下生成一个go.mod文件,通过这个文件管理包。
注意:除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希。go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同的位,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod和go.sum都应检入版本控制。go.sum 不需要手工维护,所以可以不用太关注。
-项目子目录里是不需要init的,所有的子目录里的依赖都会组织在根目录的go.mod文件里
当依赖第三方包时:
- 最初是go get 拉取,而使用go mod,直接go run 或go build 即可!
- go 会自动查找代码中的包,下载依赖包,并且把具体的依赖关系和版本写入到go.mod和go.sum文件中。
- 依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。
查看go.mod:
module test
require (
github.com/gohouse/gorose v1.0.5 //引用 包路径 版本号
)
依赖包的版本控制:
在 G O P A T H / p k g / m o d 下 的 包 中 最 后 会 有 一 个 版 本 号 v 1.0.5 , GOPATH/pkg/mod 下的包中最后会有一个版本号 v1.0.5, GOPATH/pkg/mod下的包中最后会有一个版本号v1.0.5,GOPATH/pkg/mod里可以保存相同包的不同版本。
go.mod中可指定下载包的版本:
如果在go.mod中没有指定,go命令会自动下载最新版本
如果在go.mod用require语句指定包和版本 ,go命令会根据指定的路径和版本下载包。
指定版本时可以用latest,这样它会自动下载指定包的最新版本
项目也可以放在$GOPATH/src下
go调用包的方式,默认情况下,GO111MODULE=auto 自动模式
1.auto:自动模式下,项目在$GOPATH/src里会使用$GOPATH/src的依赖包,在$GOPATH/src外,就使用go.mod 里 require的包
2.on:开启模式,1.12后,无论在$GOPATH/src里还是在外面,都会使用go.mod 里 require的包
3.off:关闭模式,就是原始方式!
init生成的go.mod的模块名称的作用
例,用 go mod init vsr 生成的go.mod文件里的第一行会申明module vsr
项目不在$GOPATH/src里,引用自己时就用模块名+路径。
例:在项目下新建目录 ppp,创建一个ppp.go文件:
package ppp
import “fmt”
func Printf(string) {
fmt.Println(“==1===”)
}
在根目录下的hello.go文件就可以 import “vsr/ppp” 引用ppp
package main
import(
"vsr/ppp"
"github.com/ gogo"
)
func main() {
ppp.Printf ("==2===")
gogo.Txec()
}