将存储库导入v2

时间:2018-11-16 19:50:45

标签: go versioning

目前,我正在将Go 1.11模块用于多个存储库。现在,我正在处理的是1.x版本。结合移动模块,我进行了一些其他重大更改,因此很明显是时候增加主版本库了。这意味着要转到版本2。

每个“执行命令”文档:

  

为保持导入兼容性,go命令要求主版本为v2或更高版本的模块使用主版本为最终元素的模块路径。例如,example.com / m的v2.0.0版本必须改为使用模块路径example.com/m/v2,并且该模块中的软件包将使用该路径作为其导入路径前缀,例如example.com/m/v2 / sub / pkg。以此方式在模块路径和导入路径中包含主要版本号称为“语义导入版本控制”。

Source

这是否像更新我的go.mod文件的第一行,并将/v2附加到模块名称那样简单?还是应该在我的存储库中创建一个v2/目录并将所有文件移入其中?

2 个答案:

答案 0 :(得分:1)

有两种方法可以转移到版本2:分支和子目录。您可以在https://research.swtch.com/vgo-module上详细了解它们(有更好的插图)。

这两个选项使一个版本可以依赖另一个版本。例如,当您实现版本2时,可以将版本1更新为依赖于版本2(但保持相同的v1 API)。然后,您只需要为库提供一种逻辑实现即可。根据项目的类型,您要提供的支持以及所需的修复程序,这可能对您不太起作用。

分支机构

master: A -> B (v1.0.0) -> D (v1.0.1)
                         \
v2:                       -> C (v2.0.0)

在这种情况下:

  1. 您在master分支上启动项目,
  2. 进行一些提交(AB
  3. 标记v1.0.0
  4. 您决定进行重大更改。因此,您将创建一个新分支(git checkout -b v2)并进行重大更改。现在必须更新go.mod,以便模块名称以/v2结尾(实际上是一个新模块!)。
  5. 您决定修复v1中的错误,因此回到该分支,进行新的提交并标记新的v1版本。

当用户需要特定版本的模块时,go会在两个分支中寻找合适的模块。

子目录

如果您不想在分支机构上发展怎么办?您可以为每个主要版本创建一个子目录。版本1停留在顶层,然后新版本移入子目录:

go.mod (module example.com/foo)
foo.go
v2/
  go.mod (module example.com/foo/v2)
  foo.go

当您用新版本标记此仓库时,v1将使用顶级版本。 v2标签将使用v2子目录。

答案 1 :(得分:0)

来自模块Wiki的Releasing Modules (v2 or Higher)部分:

  

有两种可供选择的机制来发布v2或更高版本的模块。   请注意,使用这两种技术,新的模块版本将变为   当模块作者推送新标签时,可供消费者使用。   以创建v3.0.0版本的示例为例,两个选项是:

     
      
  1. 主要分支:更新go.mod文件,使其在/v3指令的模块路径末尾包含一个module(例如{{1 }})。更新模块中的导入语句   也可以使用module github.com/my/module/v3(例如/v3)。   用import "github.com/my/module/v3/mypkg"标记发布。      
        
    • Go版本1.9.7 +,1.10.3 +和   1.11+能够正确使用并构建使用此方法创建的v2 +模块,而无需更新尚未使用的消费者代码   尚未选择使用模块(如"Semantic Import Versioning"中所述   以上部分)。
    •   
  2.   
     

...

     
      
  1. 主要子目录:创建一个新的v3.0.0子目录(例如v3),然后在该子目录中放置一个新的my/module/v3文件。   模块路径必须以go.mod结尾。将代码复制或移动到   /v3子目录。将模块内的import语句更新为   使用v3(例如/v3)。标记   用import "github.com/my/module/v3/mypkg"释放。
  2.   

但是,section中还有其他一些值得回顾的细节。

这里值得一提的一点是,如果您对自动化方法感兴趣(例如,可能需要访问许多文件),那么https://github.com/marwan-at-work/mod是一个很好的自动化解决方案,它可以自动在您的v3.0.0代码和/vN中添加,删除或更改所需的*.go。有关更多详细信息,请参见this answer