概述
目录
目录
介绍
模块路径
版本
版本类别
通用版本
伪版本
主版本后缀
兼容版本
创建库包
引用库包
库更新版本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-pre
和v2.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
最后
以上就是狂野奇迹为你收集整理的go-mod v2及以上版本的思考总结的全部内容,希望文章能够帮你解决go-mod v2及以上版本的思考总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复