golang - 包管理go modules

  作者:孙三苗

包管理go modules项目在不同服务器上运行,需要把需要的包一个一个的重新下载,这一节就来详细说明一下,如何更好的管理第三方安装包:1、go modules 介绍自从Go官方推出 1.11 之后,增加新的依赖管理模块并且更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。从 Go 1

包管理go modules

项目在不同服务器上运行,需要把需要的包一个一个的重新下载,这一节就来详细说明一下,如何更好的管理第三方安装包:

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

为了防止下载包出现超时(需要翻墙的包),请设置环境变量 GOPROXY

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

2、go mod 的使用

  • ####初始化

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

go mod init ***

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

image

(2) 运行或编译

go run main.go 或 go build main.go

运行以上代码后,会自动下载项目引用的包

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

以下是目前项目的文件内容

go.mod 文件:

module github.com/ms 

go 1.13 

require 

github.com/aaudis/GoRedisSession v0.0.0-20130613090635-98d82649209b 
github.com/anerg2046/snowflake v0.0.0-20190129041452-77ad75fdcc23 
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 
github.com/buger/jsonparser v0.0.0-20191204142016-1a29609e0929 
github.com/fatih/structs v1.1.0 github.com/gin-contrib/sessions v0.0.3 
github.com/gin-gonic/gin v1.5.0 github.com/go-acme/lego/v3 v3.2.0 
github.com/go-ego/gpy v0.0.0-20200107145826-02f541a0f91c 
github.com/go-log/log v0.1.0 github.com/gogo/protobuf v1.3.0 
github.com/goinggo/mapstructure v0.0.0-20140717182941-194205d9b4a9 
github.com/golang/protobuf v1.3.2 github.com/google/uuid v1.1.1 
github.com/hashicorp/serf v0.8.2 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a 
github.com/jinzhu/gorm v1.9.11 github.com/micro/cli v0.2.0 
github.com/micro/go-micro v1.17.1 github.com/micro/go-plugins v1.5.1 
github.com/micro/micro v1.17.1 // indirect 
github.com/mwitkow/go-proto-validators v0.3.0 
github.com/pkg/errors v0.8.1 github.com/satori/go.uuid v1.2.0 
github.com/spf13/cobra v0.0.5 // indirect 
github.com/valyala/fastjson v1.4.1 
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a 
google.golang.org/grpc v1.25.1 gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect 
gopkg.in/go-playground/validator.v9 v9.30.0 
gopkg.in/square/go-jose.v2 v2.3.1 gopkg.in/yaml.v2 v2.2.4 
)

前面部分是包的名字,也就是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 文件

cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 

cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= 
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= 
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=

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

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

go help mod
有用  |  无用

猜你喜欢