您的位置 首页 golang

Go mod的简单实践

Go mod简介:
    Go mod是官方推荐的包管理方式,开始于go1.11,在go1.12版本基本稳定,go1.13之后开始默认开启。

    本文主要从工程使用方面来介绍Go mod,包括如何简单的使用Go mod,Go mod的命令介绍,go.mod和go.sum的内容介绍,算是一篇Go mod的基础实践。

 

一、Go mod实例介绍

1. 产生go.mod文件

创建目录,使用go mod init 

$ go mod init example.com/hello // 这里的模块名称指定为example.com/hellogo: creating new go.mod: module example.com/hello $ lsgo.mod$ cat go.modmodule example.com/hello // module表示是模块,模块名称就是example.com/hellogo 1.14 // 表示的是当前使用的go版本

2. 该目录下创建一个hello.go文件,并编译产生go.sum文件

hello.go的代码如下所示

package mainimport (        "fmt"         "rsc.io/quote")func main() {            fmt.Println("go mod test start...")            defer fmt.Println("go mod test end!")            fmt.Println(quote.Hello())}

3.执行go run(备注:go buildgo test 等命令也能自动下载相关依赖包)

$ go run hello.go// 下面是下载相关依赖包的流程go: finding module for package rsc.io/quotego: downloading rsc.io/quote v1.5.2go: found rsc.io/quote in rsc.io/quote v1.5.2go: downloading rsc.io/sampler v1.3.0go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0cgo mod test start... // hello.go中的main函数开始执行你好,世界。go mod test end!// 查看 第三方库存储的位置,默认会存储到 $GOPATH/pkg/mod下面$ ls -l $GOPATH/pkg/modtotal 0drwxr-xr-x   5 zhanghui  staff  160  5 14 16:47 cached rwxr-xr-x  14 zhanghui  staff  448  1 29 16:09 github.comdrwxr-xr-x   3 zhanghui  staff   96  5 14  2019 golang.orgdrwxr-xr-x   4 zhanghui  staff  128  5 14  2019 gopkg.indrwxr-xr-x   4 zhanghui  staff  128  5 14 16:52 rsc.io // 存储的第三方库源代码// 在这一步操作之后,会生成的go.sum文件$ lsgo.mod    go.sum    hello.go

第三方库在第一次的时候会去github下载,一旦下载完成之后,后面就不会去下载了。

$ go run hello.go // 第二次执行,只是执行hello.go中的main函数go mod test start...你好,世界。go mod test end!

 

二、Go mod的命令介绍:

  • go help mod查看帮助。

  • go mod init <项目模块名称>初始化模块,会在项目根目录下生成 go.mod 文件。参数<项目模块名称>是非必写的,但如果你的项目还没有代码编写,这个参数能快速初始化模块。如果之前使用其它依赖管理工具(比如dep,glide等),mod会自动接管原来依赖关系。

  • go mod tidy根据go.mod文件来处理依赖关系。

  • go mod vendor将依赖包复制到项目下的 vendor 目录。建议一些使用了被墙包的话可以这么处理,方便用户快速使用命令go build -mod=vendor编译。

  • go list -m all显示依赖关系。go list -m -json all显示详细依赖关系。

  • go list -m -versions <path>显示包有哪些已发布版本

  • go mod download <path@version>下载依赖。参数<path@version>是非必写的,path是包的路径,version是包的版本。

  • 其它命令可以通过go help mod来查看。

三、Go mod的两个文件介绍:
go.mod和go.sum是使用go mod之后新产生的两个可编辑的文件,下面就以上面的例子生成的文件为例来介绍下它们。

1) go.mod

go.mod 提供了modulerequirereplaceexclude 四个命令

  • module 语句指定包的名字(路径)

  • require 语句指定的依赖项模块

  • replace 语句可以替换依赖项模块

  • exclude 语句可以忽略依赖项模块

// go.mod$ cat go.modmodule example.com/hello // 表示的是当前的模块名字go 1.14  // 当前go的版本号require rsc.io/quote v1.5.2 // 引用的第三方库 require是关键字,rsc.io/quote是模块名字,v1.5.2 表示版本号

2) go.sum

go.sum 的每一行都是一个条目,大致是这样的格式:

<module> <version>/go.mod <hash>

或者

<module> <version> <hash><module> <version>/go.mod <hash>

备注:其中module是依赖的路径,version是依赖的版本号。hash是以h1:开头的字符串,表示生成checksum的算法是第一版的hash算法(sha256)

  • 项目没有打 tag,会生成一个版本号,格式如下:v0.0.0-commit日期-commitID

    引用一个项目的特定分支,比如 develop branch,也会生成类似的版本号:

    v当前版本+1-commit日期-commitID

  • 项目有用到 go module,那么就是正常地用 tag 来作为版本号。

    如果项目打了 tag,但是没有用到 go module,为了跟用了 go module 的项目相区别,需要加个 +incompatible 的标志。比如:<module>+<version>+incompatible/go.mod+<hash>

  • 对于使用了 v2+ go module 的项目,项目路径会有个版本号的后缀。比如: <module/v2>+<version> + <hash>

$ cat go.sum// 没有打tag的场景golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=// 打tag的指定branch的场景rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=// 使用了go mod的场景rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

参考文档:

https://studygolang.com/articles/25658

https://blog.golang.org/using-go-modules

https://github.com/isLishude/blog/issues/195

https://juejin.im/post/5c8e503a6fb9a070d878184a


文章来源:智云一二三科技

文章标题:Go mod的简单实践

文章地址:https://www.zhihuclub.com/321.shtml

关于作者: 智云科技

热门文章

发表评论

您的电子邮箱地址不会被公开。

网站地图