philchia/agollo

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

@philchia
我fork的你的分支然后打的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之类的包管理
三,做如上的修改