go的modules怎么使用
导读:本文共7945字符,通常情况下阅读需要26分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1.go modules的基本介绍1.1 提供的命令在go环境的shell中执行go mod help查看命令和说明。Usage:gomod<command>[arguments]Thecommandsare:downloaddownloadmodulestolocalcacheediteditgo.modfromtoolsorscri... ...
目录
(为您整理了一些要点),点击可以直达。- (2):1) GO111MODULE
- (7):2) GOPROXY
- (14):3)GONOPROXY/GONOSUMDB/GOPRI
- (21):2.1.1 初始化.mod文件
- (28):2.1.2 简单一个示例
- (37):2.1.3 go modules的go get
- (45):3.1.1 包的实现
- (50):3.1.2 包的发布
- (61):3.1.3 包的使用
- (71):3.2.1 go env环境变量和git配置的修改
- (72):1.go env环境变量的修改
- (76):2.git配置的修改
- (79):3.2.2 私有包的实现
- (80):1.私有包实现
- (84):2.函数和源码
- (87):3.2.3 私有包的发布
- (90):3.2.4 私有包的引用
1.go modules的基本介绍
1.1 提供的命令
在go环境的shell中执行go mod help
查看命令和说明。
Usage:gomod<command>[arguments]Thecommandsare:downloaddownloadmodulestolocalcacheediteditgo.modfromtoolsorscriptsgraphprintmodulerequirementgraphinitinitializenewmoduleincurrentdirectorytidyaddmissingandremoveunusedmodulesvendormakevendoredcopyofdependenciesverifyverifydependencieshaveexpectedcontentwhyexplainwhypackagesormodulesareneeded
1.2 提供的环境变量
用go env
查看go的环境变量,在所有go提供的环境变量中,有一个是和go mod
相关的。
GO111MODULE="on"GOPROXY="https://goproxy.cn,direct"GONOPROXY="git.example.com,x1"GONOSUMDB="git.example.com,x1"GOPATH="/home/go-project/"GOPRIVATE="git.example.com,x1"GOSUMDB="sum.golang.org"#省略其余环境变量...
1.2.1 说明
1) GO111MODULE
go语言提供GO111MODULE
环境变量三个值,用于GO111MODULE
的开关:
auto:只要项目中包含了
go.mod
这个文件,就启动该项目的go modules,在 Go1.11 至 Go1.14 中仍然是默认值。on:启动
go modules
off:关闭
go modules
2) GOPROXY
go env
中默认的代理是GOPROXY="https://proxy.golang.org,direct"
,但是在国内是无法访问的,这里需要设置成国内的代理地址GOPROXY="https://goproxy.cn,direct"
GOPROXY
的值是一个以英文逗号 “,” 分割的 Go 模块代理列表,允许设置多个模块代理,假设你不想使用,也可以将其设置为 “off” ,这将会禁止 Go 在后续操作中使用任何 Go 模块代理。
direct
实际上 “direct” 是一个特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),场景如下:当值列表中上一个 Go 模块代理返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,也就是回到源地址去抓取,而遇见 EOF 时终止并抛出类似 “invalid version: unknown revision…” 的错误。
在cmd中执行set GO111MODULE=on
3)GONOPROXY/GONOSUMDB/GOPRIVATE
这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 git 仓库,又或是 github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。对于一些自己的私有模块代码,需要在GOPRIVATE
上设置,在拉取时会提示输入用户名和密码。
可以设置多个,用英文的逗号分隔开;或者用通配符等
goenv-wGOPRIVATE="git.example.com,github.com/eddycjy/mquote"goenv-wGOPRIVATE="*.example.com" #通配example.com的域名
2.go modules的基本使用
开启go modules
后,就可以创建项目并且生成mod文件,来管理项目的所有依赖了。以下是go env
环境的配置:
GO111MODULE="auto"GOARCH="amd64"GOBIN="/go/bin/"GOCACHE="/root/.cache/go-build"GOENV="/root/.config/go/env"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOINSECURE=""GONOPROXY=""GONOSUMDB=""GOOS="linux"GOPATH="/home/go-project/"GOPRIVATE=""GOPROXY="https://goproxy.cn,direct"GOROOT="/go"GOSUMDB="sum.golang.org"GOTMPDIR=""GOTOOLDIR="/go/pkg/tool/linux_amd64"GCCGO="gccgo"AR="ar"CC="gcc"CXX="g++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g-O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g-O2"CGO_FFLAGS="-g-O2"CGO_LDFLAGS="-g-O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC-m64-pthread-fmessage-length=0-fdebug-prefix-map=/tmp/go-build940953411=/tmp/go-build-gno-record-gcc-switches"
设置了GOPATH
为/home/go-project/
,并且代理指向了国内的代理地址,防止国外镜像无法访问的情况。
2.1 初始化项目
在$GOPATH
目录下创建一个新的项目example.com/mycount/hello
,example.com
模拟github.com,mycount
模拟账号,hello
是最终的项目名称。目录和文件结构:
2.1.1 初始化.mod文件
在hello
目录下执行go mod init example.com/mycount/hello
初始化hello项目的mod文件,如下:
执行完初始化操作后生成了一个go.mod的文件,里面只记录了2行:
module:用于定义当前项目的模块路径
go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用
2.1.2 简单一个示例
在hello
目录下写一个main.go
的文件,里面用了一个第三方的库。
packagemainimport( "net/http" "github.com/gin-gonic/gin" "github.com/json-iterator/go")typerespstruct{ Statusint`json:"status"` Messagestring`json:"message"`}funcmain(){ router:=gin.Default() router.GET("/",hello()) iferr:=router.Run(":6060");err!=nil{ panic(err) }}funchello()gin.HandlerFunc{ returnfunc(context*gin.Context){ strResp,_:=jsoniter.MarshalToString(resp{ Status:http.StatusOK, Message:"success", }) context.String(http.StatusOK,strResp) }}
在hello
目录下执行go get
命令,拉取依赖库:
拉取依赖之后生成了一个go.mod和go.sum文件,go.mod文件:
go.sum的内容:
同时在$GOPATH
目录下多了一个pkg文件,里面有拉取的文件依赖。这个文件是一个全局的缓存,
2.1.3 go modules的go get
在拉取项目依赖时,你会发现拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取), 并且在拉取信息上一共分为了三段内容:
需要注意的是,所拉取版本的 commit 时间是以UTC时区为准,而并非本地时区,同时我们会发现我们 go get 命令所拉取到的版本是 v0.0.0,这是因为我们是直接执行 go get -u 获取的,并没有指定任何的版本信息,由 Go modules 自行按照内部规则进行选择。
那么我想选择具体版本应当如何执行呢,如下:
3.使用go mod发布自己的包
3.1 发布公开的包
公开的发布包无需修改go env中的一些环境变量,默认的环境变量即可。
3.1.1 包的实现
假设我们有一个模块需要提供给第三方使用,并且这个包是发布在了gittee上,假设我在gitee上得账号是gitee.com\luciferofwg
。我们后期会根据迭代或者功能维护版本,每当有更新或者升级的时候就发布最新的版本,版本遵循语义化版本定义。什么是语义化版本
这个包中包含一个函数,用于打印一句话,如下所示:
//hello.gopackagehelloimport"fmt"funcSayHello(){ fmt.Println("helloworld")}
在GOPATH下新建目录hello
,在命令行下进入hello
目录,执行go mod init
来生成go mod文件,如下:
生成的包名为gitee.com/luciferofwg/hello
,后期在引用这个包时就import 这个包名。
将hello
仓库提交到gitee
上,完成发布包的第一个阶段。
3.1.2 包的发布
经过上一步骤,在仓库中就有了一个名为hello
的公开仓库,如下:
假如我们认为这个版本是稳定可靠的,这时候我们需要发布一个可以使用的版本,gitee发布的流程如下:
点击仓库中右侧的创建
按钮,在弹出的页面中创建发行版本号,填写完毕后点击创建发行版本
完成发布。
图1 创建发行版本
图2 发行版本信息
图3 已创建的发行版本
到此我们发行了一个版本为v1.0.4
的版本。
3.1.3 包的使用
对于已经发行的包,这里介绍如何使用它。首先定义一个名为test
的包,因为test为调用的程序,因此我们初始化mod时直接按照程序的名字初始化,即:go mod test
,完成初始化。如下:
在test
目录下编写如下代码:
packagemainimport"gitee.com/luciferofwg/hello"funcmain(){ hello.SayHello()}
然后再命令行中执行go mod tidy
整理go mod,此时go mod
会根据程序包的引用关系按照包名从互联网上拉去对应的包。执行完成后go.mod
如下:
运行的结果:
需要注意的是:
默认拉去的是最新的发布版本,如果想制定版本,只需要修改go.mod中require最后面的版本号即可。如何修改go.mod
参考go help mod
命令的edit
项。
3.2 发布私有包
3.2.1 go env环境变量和git配置的修改
1.go env环境变量的修改
私有包和公开包的区别最大的区别是权限的和git拉去包的过程,这时候需要对go env
中的一些参数修改。涉及到的一些参数GOINSECURE
,GONOPROXY
,GONOSUMDB
,含义:GOINSECURE
:如果代码仓库是自己搭建的,没有“合法”的证书,则需要配置这个信息GONOPROXY
:在这个变量中配置的域名或者仓库地址不会走代理(我们在前面设置了cn的代理)GONOSUMDB
:1.15后会对包进行校验,此处的配置和GONOPROXY
的含义一样
看一下我们的go env
变量,之前已经修改过了,内容如下:
注:
windows下修改时直接将上述的配置增加系统的环境变量即可,linux下在bash的配置文件中修改(具体修改可以自行搜索)。
2.git配置的修改
由于是私有的包,拉去时需要获取拉去的权限,默认的https或者http的方式需要密码。如果我们本地已经配置了对应的gitee上的私钥,且已经在gitee对应的账户上配置了权限,那么我们就可以通过git@xxx
的方式访问私有的仓库。
打开本地git的配置,windows下是c:\\user\\用户名\\.bashconfig
文件,打开这个文件。增加以下代码:
[url"git@gitee.com:"]insteadof=https://gitee.com
表示访问https://gitee.com
的过程替换为git@gitee.com:
,即通过bash就可以访问私有库了。
3.2.2 私有包的实现
1.私有包实现
我们创建一个私有的仓库,名为hi,包含一个函数SayHello,打印hello world。
同样的,创建go.mod
,实现SayHello函数,推送到gitee。
图1 私有仓库hi
2.函数和源码
//hi包的SayHello函数packagehiimport"fmt"funcSayHello(){ fmt.Println("hi,world")}
hi包的go.mod
3.2.3 私有包的发布
根据上述的源码,使用同样的方式发布版本。
图1 发布的版本1.0.0
3.2.4 私有包的引用
如果已经配置了go env的参数和git配置,使用的过程和公开包的使用是一样的。基于原来的版本,增加了一个hi
包的函数引用和导入,在test目录下执行go mod tidy
,就会自动拉取发布的包了。
packagemainimport( "gitee.com/luciferofwg/hello" "gitee.com/luciferofwg/hi")funcmain(){ hello.SayHello() hi.SayHello()}
test程序的go.mod如下:
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
go的modules怎么使用的详细内容,希望对您有所帮助,信息来源于网络。