golang 的 goproxy 和包版本管理
By S.F.
本文链接 https://www.kyfws.com/post/golangpm/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 3 分钟阅读 - 1352 个词 阅读量 0golang 的包管理
前言
golang 开发很多时候,会用到了三方库,比如 iris ,当前最新版本已经是12.x,默认 go get 的都是最新版本,老版本的API和新版本的都不同,以往是获取完后,进入 $GOPATH\src\github.com\kataras\iris 目录内,checkout想要的版本分支,否则会导致项目需要修改接口才能编译,但是多个项目同时引用了 iris 5.x 或者 iris 6.x ,怎么办?
使用 gopkg.in 解决版本问题
这种问题可以使用 gopkg.in 网站来引入包,方法如下:
比如目标包是:https://github.com/go-pkg/pkg ,项目tag 或者分支有 v3, v3.N 或者 v3.N.M ,对应的导入统一修改为 pkg.V3,如下所示:
-
gopkg.in/pkg.v3 → github.com/go-pkg/pkg (branch/tag v3, v3.N, or v3.N.M)
-
gopkg.in/user/pkg.v3 → github.com/user/pkg (branch/tag v3, v3.N, or v3.N.M)
gopkg.in URL中使用的“ v1”或“ v42”数字,代表Go软件包的主要版本。可以随着时间的推移继续工作,而不会受到破坏的依赖关系的影响。
为了清楚起见,假设存储库包含以下标记或分支:
-
v1
-
v2.0
-
v2.0.3
-
v2.1.2
-
v3
-
v3.0
以下选择器将按照指示进行解析:
-
pkg.v1 →标签或分支v1
-
pkg.v2 →标签或分支v2.1.2
-
pkg.v3 →标签或分支v3.0
零版本(v0)是为不成熟的软件包,以至于提供任何种类的API稳定性保证都是不合理的。这等效于将软件包标记为alpha或beta,因此不建议将这些软件包用作稳定软件包和应用程序的依赖项。
gopkg.in 目前主要存在的问题是,它分发版本可以,但是实际上的 go get
行为 git
命令还是需要访问源站,国内网络很多情况下是无法成功的。
用 go module 解决所有问题
首先,它是官方出品,go mod 使用方法如下:
export GO111MODULE=on #开启 module 的支持
go mod init <project name> #到项目目录内初始化
# go mod init HelloWorld
# or
# go mod init .
export GOPROXY=https://goproxy.io #国内请挂代理
# 可以省略下一步的 download ,你可以先代码引用,go run或 go build时会自动匹配和下载
# 但是建议手工下载,用于指定版本,很多三方库的API随时都在调整,避免版本问题
go mod download repo@version #下载指定版本的依赖库
# go mod download github.com/robfig/cron/v3@v3.0.0
推荐几个GOPROXY地址,方便后期使用
shell
输入下面(三选一),我用的https://goproxy.io
#export GOPROXY=https://goproxy.cn
export GOPROXY=https://goproxy.io
#export GOPROXY=https://mirrors.aliyun.com/goproxy
建议:或者用go
命令设置为永久
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io
Russ Cox 的 Golang Module 系列文章
Go & Versioning (原版)
Posted on Tuesday, February 20, 2018. These are the posts in the February 2018 “Go & Versioning” series:
- “Go += Package Versioning” [PDF].
- “A Tour of Versioned Go (vgo)” [PDF].
- “Semantic Import Versioning” [PDF].
- “Minimal Version Selection” [PDF].
- “Reproducible, Verifiable, Verified Builds” [PDF].
- “Defining Go Modules” [PDF].
- “Versioned Go Commands” [PDF].
The official Go proposal is at https://golang.org/issue/24301, filed on March 20, 2018 and accepted on May 21, 2018.
These are followup posts:
- “The vgo proposal is accepted. Now what?” [PDF].
- “What is Software Engineering?” [PDF].
- “Why Add Versions To Go?” [PDF].
- “The Principles of Versioning in Go” [PDF].
Golang 版本管理系列 翻译 11 篇全
作者 VikydZhang
MIT License
- 20200112 Golang 20180220 Part01 译:Go += 包版本管理 - Go += Package Versioning
- 20200117 Golang 20180220 Part02 译:Go 语言的版本管理教程(vgo) - A Tour of Versioned Go (vgo)
- 20191128 Golang 20180221 Part03 译:基于语义的 import 版本管理 - Semantic Import Versioning
- 20191229 Golang 20180221 Part04 译:最小版本选择 - Minimal Version Selection
- 20191215 Golang 20161213 译:软件版本的 SAT 问题 - Version SAT
- 20191117 Golang 20180221 Part05 译:可复现、可验证、可证明的构建 - Reproducible, Verifiable, Verified Builds
- 20200117 Golang 20180222 Part06 译:定义 Go 语言的模块 - Defining Go Modules
- 20200120 Golang 20180223 Part07 译:Go 语言的版本管理命令 - Versioned Go Commands
- 20191116 Golang 20180529 Part08 译:vgo 提案被接受了,然后呢? - The vgo proposal is accepted. Now what?
- 20191116 Golang 20180530 Part09 译:什么是软件工程? - What is Software Engineering?
- 20191116 Golang 20180607 Part10 译:为什么要为 Go 添加版本管理功能? - Why Add Versions To Go?
- 20200209 Golang 20191203 Part11 译:Go 语言的模块版本管理原则 - The Principles of Versioning in Go