初探golang和应用其框架 gin 的 使用教程(三)包管理go modules

4 篇文章 0 订阅

目录

一、 go modules 介绍

 

二、go mod 的使用

1、初始化

(1)使用命令初始化go.mod

(2)初始化完成后,再编译main.go

(3)查看 文件 go.mod和 go.sum

2、包版本控制管理

3、goland配置


说明:本节主要说明基于gin 项目的包管理 go modules。

操作环境:linux 64

golang 版本: 1.13.1

如果有相关需要可联系我本人(联系方式可参照置顶文章 :获取我的联系方式)获取。


上一节已经大体说明了一下项目的文件布局,其中 需要很多第三方,但是管理起来比较麻烦,比如项目在不同服务器上运行,需要把需要的包一个一个的重新下载,这一节就来详细说明一下,如何更好的管理第三方安装包:

一、 go modules 介绍

自从 Go 官方推出 1.11 之后,增加新的依赖管理模块并且更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。

从 Go 1.11 开始,Go 允许在 $GOPATH/src 外的任何目录下使用 go.mod 创建项目。在 $GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 Go 1.13 开始,模块模式将成为默认模式。

建议:为了体验go 更多的功能和解决版本问题,请升级go 到最新版

模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

如果你想直接使用modules而不需要从GOPATH过度,那么把“GO111MODULE”设置为on。

设置命令如下:

go env -w GO111MODULE=on

查看 环境配置

go env

 

二、go mod 的使用

下面是我基于已有项目来使用 go mod。

1、初始化

(1)使用命令初始化go.mod

go mod init ***

说明:其中 *** 可以是自己项目的名字,以便区分。 现在我就是 使用项目名字来初始化,命令为:go mod init  globaladmin

查看生成的mod.go文件,如下:

 

(2)初始化完成后,再编译main.go

当我们使用go build,go test以及go list时,go会自动得更新go.mod文件,将依赖关系写入其中。

如果出现如下类似错误:

go: finding github.com/fvbock/endless latest
go: downloading github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
verifying github.com/fvbock/endless@v0.0.0-20170109170031-447134032cb6: github.com/fvbock/endless@v0.0.0-20170109170031-447134032cb6: Get https://sum.golang.org/lookup/github.com/fvbock/endless@v0.0.0-20170109170031-447134032cb6: dial tcp 216.58.200.49:443: i/o timeout

这说明,项目中引入的第三方包有新的版本,在下载的时候请求超时。

解决办法:设置环境变量  GOPROXY

go env -w GOPROXY=https://goproxy.cn,direct

再次编译即可。

如果出现如下错误: cannot find module for path

build _/项目路径/项目名/某一包名: cannot find module for path _/项目路径/项目名/某一包名

 则说明项目中未找到这个包。

说明:在未使用 mod 前,引用自定义的包,可以使用相对路径来引用使用,现在要使用mod 来管理包,需要写项目的绝对路径,把 使用  ../ 或  ./  的部分 替换成  项目名/  即可。

如:以前写法为 ./conf  和 ./router  现在 改为如下图所示:

其中 : globaladmin 是我的项目文件夹名。

再次编译 项目:

go build main.go

显示结果如下:

go: finding gopkg.in/olivere/elastic.v5 v5.0.82
go: finding github.com/gin-gonic/gin v1.4.0
go: finding github.com/go-sql-driver/mysql v1.4.1
go: downloading github.com/gin-gonic/gin v1.4.0
go: downloading github.com/go-sql-driver/mysql v1.4.1
go: downloading gopkg.in/olivere/elastic.v5 v5.0.82
go: finding github.com/foolin/gin-template latest
go: extracting github.com/go-sql-driver/mysql v1.4.1
go: extracting github.com/gin-gonic/gin v1.4.0
go: downloading github.com/foolin/gin-template v0.0.0-20190415034731-41efedfb393b
go: extracting gopkg.in/olivere/elastic.v5 v5.0.82
go: extracting github.com/foolin/gin-template v0.0.0-20190415034731-41efedfb393b
go: downloading github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
go: downloading gopkg.in/yaml.v2 v2.2.2
go: downloading github.com/mattn/go-isatty v0.0.7
go: downloading github.com/golang/protobuf v1.3.1
go: downloading gopkg.in/go-playground/validator.v8 v8.18.2
go: downloading github.com/ugorji/go v1.1.4
go: extracting github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
go: extracting github.com/mattn/go-isatty v0.0.7
go: downloading golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
go: downloading github.com/pkg/errors v0.8.0
go: downloading github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5
go: extracting gopkg.in/yaml.v2 v2.2.2
go: extracting gopkg.in/go-playground/validator.v8 v8.18.2
go: extracting github.com/golang/protobuf v1.3.1
go: extracting github.com/pkg/errors v0.8.0
go: extracting github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5
go: extracting github.com/ugorji/go v1.1.4
go: extracting golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
go: finding github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
go: finding github.com/golang/protobuf v1.3.1
go: finding github.com/ugorji/go v1.1.4
go: finding gopkg.in/go-playground/validator.v8 v8.18.2
go: finding gopkg.in/yaml.v2 v2.2.2
go: finding github.com/mattn/go-isatty v0.0.7
go: finding golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
go: finding github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5
go: finding github.com/pkg/errors v0.8.0

再执行: 

./main

一切正常!

 

(3)查看 文件 go.mod和 go.sum

初始化完成,看一下这两个文件有啥变化。

go.mod 文件:

module globaladmin

go 1.13

require (
	github.com/foolin/gin-template v0.0.0-20190415034731-41efedfb393b
	github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6 // indirect
	github.com/gin-gonic/gin v1.4.0
	github.com/go-sql-driver/mysql v1.4.1
	gopkg.in/olivere/elastic.v5 v5.0.82
)

前面部分是包的名字,也就是import时需要写的部分,而空格之后的是版本号,版本号遵循如下规律:

X.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
vX.0.0-yyyymmddhhmmss-abcdefabcdef
vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef
vX.Y.Z

也就是版本号+时间戳+hash,我们自己指定版本时只需要制定版本号即可,没有版本tag的则需要找到对应commit的时间和hash值。默认使用最新版本的package。

 

go.sum 文件:

github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/foolin/gin-template v0.0.0-20190415034731-41efedfb393b h1:pAJ/RYH5lYGDg55jBX658waK6LlqdPCaB65TG6GCAfE=
github.com/foolin/gin-template v0.0.0-20190415034731-41efedfb393b/go.mod h1:C2ca9FYDoq/nsiqURv2kJwzhqXAgSXTTES2q25whECc=
github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6 h1:6VSn3hB5U5GeA6kQw4TwWIWbOhtvR2hmbBJnTOtqTWc=
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6/go.mod h1:YxOVT5+yHzKvwhsiSIWmbAYM3Dr9AEEbER2dVayfBkg=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5 h1:0x4qcEHDpruK6ML/m/YSlFUUu0UpRD3I2PHsNCuGnyA=
github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/olivere/elastic.v5 v5.0.82 h1:QH7ere4lvOAWnnOd0VLJ54W8LzExZszoGIRijnb1h2Y=
gopkg.in/olivere/elastic.v5 v5.0.82/go.mod h1:uhHoB4o3bvX5sorxBU29rPcmBQdV2Qfg0FBrx5D6pV0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

go.sum文件是我们直接引用的package和它自身需要的以来的版本记录,go modules就是根据这些去找到需要的packages的。

如果我们不做任何修改,默认会使用最新的包版本,如果包打过tag,那么就会使用最新的那个tag对应的版本。

 

2、包版本控制管理

包管理的另外一项重要功能就是包的版本控制。modules同样可以做到。

在介绍版本控制之前,我们要先明确一点,如果上层目录和下层目录的go.mod里有相同的package规则,那么上层目录的无条件覆盖下层目录,目的是为了main module的构建不会被依赖的package所影响。

 

前面我已经介绍go.mod, 后面跟的是 版本号。

只是举例(版本可能不存在):现在我们要修改依赖关系了,我们想使用gin 的 v1.4.1版本,怎么办呢?

只需要如下命令:

go mod edit -require=github.com/gin-gonic/gin@v1.4.1

 

更多的mod 命令可使用:

go help mod

Usage:

    go mod <command> [arguments]

The commands are:

    download    download modules to local cache
    edit        edit go.mod from tools or scripts
    graph       print module requirement graph
    init        initialize new module in current directory
    tidy        add missing and remove unused modules
    vendor      make vendored copy of dependencies
    verify      verify dependencies have expected content
    why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

来进一步熟悉和学习。

 

3、goland配置

打开goland设置

根据提示勾选和选择即可(注:SDK 1.13.3 是当前最新版本 截止:2019年10月21日17:45:21,是我本地使用的版本 )。

 

本项目的其他具体操作和具体使用将在后续章节中继续详细说明。

希望本文对你学习有所帮助,感谢您的阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值