go-mod v2及以上版本的思考

目录

目录

介绍

模块路径

版本

版本类别

通用版本

伪版本

主版本后缀

兼容版本

创建库包

 引用库包

库更新版本v0.0.1

更新版本库为v2.0.0

总结

Tips

引用

介绍

go mod 是go对包管理支持,在go1.11版本添加的,在go1.13版本默认开启GO111MODULE="on",且不会受到GOPATH影响。在项目下通常会生成一个go.mod文件。

cat {project}/go.mod

module github.com/seanshenhy/go-mod-demo/v2

go 1.16

模块路径

我们在应用中通常引用第三方库包时需要使用go get {项目地址},这里的{项目地址}称为模块路径,模块的路径是包内的公共前缀,它由存储库根路径、存储库目录和主要版本后缀构成。其中存储库根路径是开发中版本控制存储库的根目录。存储库目是模块下包含的子包,该包提供独立功能。主要版本后缀则是Go modules中对于v2及以上版本需要在模块名中申明。

举个例子:在github.com中我创建了一个go-mod-demo库,该库也称为模块,模块的版本为v2。而demo则称为包,而github.com/seanshenhy/go-mod-demo/v2是go-mod-demo模块路径,github.com/seanshenhy/go-mod-demo也叫做存储库根路径,v2是版本后缀(非必须),demo是存储库目(也是个目录)。

github.com/seanshenhy/go-mod-demo/v2

在创建go.mod时使用go mod init指定的模块路径。

go mod init github.com/seanshenhy/go-mod-demo/v2

在其他应用中使用方式见下。

1)模块引入

go get github.com/seanshenhy/go-mod-demo/v2

 2)代码使用

import (
 "github.com/seanshenhy/go-mod-demo/v2/demo"
)

版本

版本分为两种一种是常见的标准版本的通常由.分割为三部分,分别为主要、次要和补丁版本。例如下列引入的redis包版本为v7.4.1;另一种补丁版本是在标准版本后面添加pre-relese等字眼,例如 v8.0.5-prev2.0.9+incompatible其中,前者表示待发版本前的版本,其中v8.0.5是还未正式发布;后者是用在做不兼容版本发布策略(以前没有mod时对大于v2及以上版本方式的兼容)。

module github.com/seanshenhy/go-mod-demo/v2

go 1.16

require github.com/go-redis/redis/v7 v7.4.1

对于v7.4.1,主要版本为 7,次要版本为 4,补丁版本为1。go mod对于版本有3种分类。0.x.x版本是不稳定版本有大改的可能,1.x.x是稳定可用版本可投入实际生产使用,2.x.x及以上版本是go mod需要在go.mod文件中增加版本v2,v3,...(例如github.com/xxxxxx/v2),在使用的时候,需要以下方式引用 go get github.com/xxxx/v2。

版本类别

通用版本

对于打了版本的会在末尾追加最新版本例如v0.1.0


github.com/seanshenhy/go-mod-demo v0.1.0

对于在代码中没被引用的会在 后面加indirect。

github.com/seanshenhy/go-mod-demo v0.1.0 // indirect

伪版本

对于没有打tag的版本返回类似下面形式v0.0.0-20220708160210-fc5e318e30f7,v0.0.0是最近提交的版本号,20220708160210时间戳,fc5e318e30f7随机字符串。

module dss

go 1.16

require github.com/seanshenhy/go-mod-demo v0.0.0-20220708160210-fc5e318e30f7

主版本后缀

对于2.0及以上的版本需要在mod文件中的module后加上v2。

module github.com/seanshenhy/go-mod-demo/v2

go 1.16

使用时go.mod文件中添加

github.com/seanshenhy/go-mod-demo/v2 v2.0.0

兼容版本

对于在以前没有go.mod时(例如:旧版本go1.9),却使用了v2.0.0及以上版本表示,在下载包时会出现v2.0.0+incompatible类型如下图所示。举个例子GitHub - blang/semver at v3.5.1

github.com/seanshenhy/go-mod-demo v2.0.0+incompatible

---------------------------------------------------------------------------------------------------------------------------------

未完,待续,接下来会github创建项目实战这几种modules状态,以及怎样创建v2以上的库包,然后引用。

---------------------------------------------------------------------------------------------------------------------------------

创建库包

1) 在github上创建一个go-mod-demo项目。

https://github.com/seanshenhy/go-mod-demo.git

2)克隆在本地

git clone https://github.com/seanshenhy/go-mod-demo.git

3) 增加demo目录,创建demo.go文件

mkdir -p {project}/demo && touch {project}/demo/demo.go

4)在{project}下初始化模块

go mod init github.com/seanshenhy/go-mod-demo

5)编辑demo.go文件

package demo

import (
	"github.com/go-redis/redis/v7"
)

type Demo struct {
	redis *redis.Client
}

func NewDemo(rds *redis.Client) *Demo {
	return &Demo{
		redis: rds,
	}
}
func TestDemo1() {
}

6)提交文件到github main

git add .
git commit -m "first commit"
git push -u origin main

 引用库包

1)在本地创建项目dss

mkdir -p ~/code/golang/dss

2)创建mod

go mod init dss

3)获取库包go-mod-demo

go get github.com/seanshenhy/go-mod-demo

4)创建main.go文件引用go-mod-demo

package main

import (
	"github.com/seanshenhy/go-mod-demo/demo"
)

func main() {
	demo.TestDemo1()
}

发现dss项目下go mod文件如下。

module dss

go 1.16


require github.com/seanshenhy/go-mod-demo v0.0.0-20220708160210-fc5e318e30f7

库更新版本v0.0.1

1)在github.com/seanshenhy/go-mod-demo/demo/demo.go下编辑如下。

package demo

import (
	"github.com/go-redis/redis/v7"
)

type Demo struct {
	redis *redis.Client
}

func NewDemo(rds *redis.Client) *Demo {
	return &Demo{
		redis: rds,
	}
}
func TestDemo1() {
return
}

2)打一个tag为v0.0.1版本并推送到远端

git tag v0.0.1
git push origin v0.0.1

3)更新dss项目引用github.com/seanshenhy/go-mod-demo

go get -u github.com/seanshenhy/go-mod-demo

4)dss下的mod文件go-mod-demo库包被更新了

module dss

go 1.16


require github.com/seanshenhy/go-mod-demo v0.0.1

更新版本库为v2.0.0

1)在库go-mod-demo的main版本上创建分支

git checkout -b v2

 2)在v2上编辑go-mod-demo/demo/demo.go文件,编就内容如下。

package demo

import (
	"github.com/go-redis/redis/v7"
)

type Demo struct {
	redis *redis.Client
}

func NewDemo(rds *redis.Client) *Demo {
	return &Demo{
		redis: rds,
	}
}
func TestDemo1(a int)int {
return a + 12
}

3)编辑mod文件

// 在go-mod-demo项目下
go mod edit --module=github.com/seanshenhy/go-mod-demo/v2 go.mod

4)提交版本v2到远端并打tag

# 提交v2版本
git add .
git commit -m "v2 commit"
git push -u origin v2

# 打tag v2.0.0
git tag v2.0.0
git push origin v2.0.0

5)更新dss项目引用github.com/seanshenhy/go-mod-demo

go get -u github.com/seanshenhy/go-mod-demo

6)dss下的mod文件go-mod-demo库包被更新了

module dss

go 1.16


require github.com/seanshenhy/go-mod-demo/v2 v2.0.0

总结

对于go modules我们在开发中只需要知道两点即可,一是go.mod文件引用库包的含义(v0.x.x和v1.x.x区别,版本后带// indirect的含义,版本类型为v0.0.0-20220708160210-fc5e318e30f7含义, 版本类型为v2.0.0+incompatible含义),二 v2以下与v2及以上版本库模块名称定义和引用区别,库包定义时,v2以前的版本在go.mod文件中modules后没有/vx,v2及以上则必须带上/vx;使用时,v2以前版本 直接go get {库包}即可,v2及以上则需要使用go get {库包/vx}方式。

Tips

若库包包含多版本,则最好使用vx方式单独维护分支,这是常见的一种方式,例如:github.com/go-redis/redis库维护了多个分支。

引用

深入Go Module之讨厌的v2

Go语言技巧 - 5.【初探Go Module】Go语言的版本管理 - 墨天轮

浅谈Go Modules原理

Go Modules Reference - The Go Programming Language

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值