agollo有关Releasing Modules (v2 or Higher)的问题
Closed this issue · 5 comments
我基于agollo弄了一个项目apollo-app,它依赖的agollo的tag明显打了v2.2.0,但是go mod tidy -v的时候只能拉到v2.1.0的tag。不符合期望。
$ go mod init github.com/xujintao/apollo-app
go: creating new go.mod: module github.com/xujintao/apollo-app
$ go mod tidy -v
go: finding github.com/xujintao/agollo v2.1.0+incompatible
go: downloading github.com/xujintao/agollo v2.1.0+incompatible
go: finding github.com/philchia/agollo/internal/mockserver latest
go: finding github.com/philchia/agollo/internal latest
go: finding github.com/philchia/agollo v2.1.0+incompatible
go: downloading github.com/philchia/agollo v2.1.0+incompatible
我现在只能在go mod tidy -v完了以后,继续执行go get github.com/xujintao/agollo@v2.2.0,才能勉强拉取到v2.2.0
$ go get github.com/xujintao/agollo@v2.2.0
go: finding github.com/xujintao/agollo v2.2.0
go: finding github.com/mitchellh/mapstructure v1.1.2
go: finding gopkg.in/yaml.v2 v2.2.2
go: finding gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
go: downloading github.com/xujintao/agollo v0.0.0-20181228033236-47a518f5a0d1
而这个明显不够友好。
我查阅了相关资料,比如Semantic Import Versioning以及releasing-modules-v2-or-higher
了解到当前agollo已经是>=v2.0.0也就是落到了"v2+"规范。
然而规范我看了半天,没看懂,求指导。
@philchia
@wweir
我这里没有打 v2.2.0的tag
内部代码引用的都是我的包
是的,这个就是fork的悲剧。为了做实验要把你里面依赖自己的import的包名的语句改一下,幸亏你只依赖internal/mockserver。
这也是个问题,我到现在还没找到什么好方法,可能replace能规避这个问题,但replace始终不够主流。
这里有个文章Introduction to Go Modules介绍了go modules对v2+进行的处理,按照文章的思路,我们的agollo可能要做如下的修改:
1, go.mod文件中
module github.com/philchia/agollo
改成:
module github.com/philchia/agollo/v2
2, agollo_test.go文件中
import (
"log"
"os"
"testing"
"time"
"github.com/philchia/agollo/internal/mockserver"
)
改为
import (
"log"
"os"
"testing"
"time"
"github.com/philchia/agollo/v2/internal/mockserver"
)
3, 用户使用的时候要这样导入agollo的包
比如导入老的包
import "github.com/philchia/agollo"
比如导入v2+的包
import "github.com/philchia/agollo/v2"
是有点奇怪,因为到目前为止github上99%的go项目都还停留在v0,v1这样的tag,所以v2+问题并没有引起注意,但是我们的agollo是v2+的。
现在路有3条:
一,我们自己实现mapstructuce,也自己实现yaml解析,然后做到零依赖
二,放弃go modules改用dep之类的包管理
三,做如上的修改