当项目中存在同一个第三方包依赖,并且依赖版本不一致时,Go Modules使用的“最小版本选择算法”(The minimal version selection algorithm: https://github.com/golang/go/wiki/Modules#version-selection )。
Go Modules
The minimal version selection algorithm
例如,如果您的模块依赖于具有require D v1.0.0的模块A,并且您的模块还依赖于具有require D v1.1.1的模块B,则最小版本选择将会选择D的v1.1.1版本用以构建(使用最高版本)。
require D v1.0.0
require D v1.1.1
v1.1.1
请不要问我为什么这个算法名字叫“最小版本选择算法”,然而内容却是“最高版本选择算法”,若有纠结于此的同学欢迎向官方提issue:https://github.com/golang/go/issues
如果你可以通过go.mod完美地管理当前的项目包依赖,那么可以忽略该章节。如果你在处理项目的包依赖管理中遇到了问题,那么建议你继续阅读该章节,可以找到解决问题的灵感。
go.mod
前面章节我们非常详细、图文并茂地介绍了基本的开发环境安装/配置、Go Module安装使用,在实际的项目开发中,你会发现更多的问题,常见的:
Go Module
GoFrame
golang.org
HTTPS
go get
如果你遇到了上面所提到的问题,我们建议的解决方案:通过GOPRIVATE的方式设置私有包有效域名。
GOPRIVATE
例如以下命令行方式:
export GOPROXY=https://goproxy.cn export GOPRIVATE=git.xxx.com CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go
该特性需要Go v1.13以上版本支持。
Go v1.13
在Goland中这么设置:
Goland