为什么Golang软件包必须是v0或v1,而不是v2020

为什么Golang软件包必须是v0或v1,而不是v2020,go,go-modules,Go,Go Modules,我到处都读到包必须有v0或v1的标签。为什么标签不能是v2020或v0或v1以外的东西。我已经尝试过这个个人,并且在使用v2020时出现以下错误 Scotts-Mac-mini:seeding syacko$ go mod tidy go: errors parsing go.mod: /Users/syacko/workspace/sotesoft/src/utils/seeding/go.mod:10: require gitlab.com/soteapps/packages: versio

我到处都读到包必须有v0或v1的标签。为什么标签不能是v2020或v0或v1以外的东西。我已经尝试过这个个人,并且在使用v2020时出现以下错误

Scotts-Mac-mini:seeding syacko$ go mod tidy
go: errors parsing go.mod:
/Users/syacko/workspace/sotesoft/src/utils/seeding/go.mod:10: require gitlab.com/soteapps/packages: version "v2020.2.0" invalid: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2020
Scotts-Mac-mini:seeding syacko$ 

这是一个惯例,对每个人来说都很方便。Go模块选择使用广泛接受的

如果我创建了一个go.mod,但没有将semver标记应用到我的存储库,会发生什么?

是模块系统的基础。为了给消费者提供最佳体验,鼓励模块作者使用semver VCS标签(例如v0.1.0或v1.2.3-rc.1),但并不严格要求使用semver VCS标签:

  • 模块需要遵循semver规范,以便go命令按文件规定运行。这包括遵循semver规范,说明如何以及何时允许中断更改

  • 没有semver VCS标签的模块由消费者使用semver版本以。通常,这将是v0主版本,除非模块作者按照该方法构建了v2+模块

  • 因此,未应用semver VCS标记且未创建“主要子目录”的模块实际上是在声明自己属于semver v0主要版本系列,基于模块的使用者会将其视为具有semver v0主要版本

  • Dave Cheney在Go模块之前发表的一篇有趣且相关的博文:

    我们想要什么?Go软件包的版本管理!我们什么时候要?昨天

    […]我们希望我们选择的Go build工具在您开始在项目中使用包时获取最新的稳定版本。[…]

    但就目前而言,在2016年的今天,人类或工具无法查看任意的git(或mercurial,或bzr等)Go代码存储库并提出以下问题:

    • 这个项目发布了哪些版本
    • 这个软件的最新稳定版本是什么
    • 如果我有版本1.2.3,是否有我应该应用的错误修复或安全更新
    原因是Go项目(Go软件包的存储库)没有版本,至少我们在其他语言中的朋友没有使用这个词。Go项目没有版本,因为没有正式的发布过程

    […]我建议Go项目采用。这是一个可靠的标准,许多人(不仅仅是Go程序员)都很理解它,语义版本控制将让人们编写工具,在最小的发布过程之上构建依赖关系管理生态系统


    重新阅读github.com/golang/go/wiki/…,我发现问题不在于v2020.y.z,而在于目录结构与版本号不匹配。路径abc/def/v2020-v2020.y.z应该可以工作。谢谢你的各种链接。一个很好的工作示例是github.com/jackc/pgx/v4

    以下是您要使用的项目版本的步骤: 当您要将版本更改为V2或更高版本时,需要遵循以下步骤

    更改版本前的示例go.mod文件
    module gitlab.com/soteapps/packages
    
    go 1.14
    
    require (
        github.com/aws/aws-sdk-go v1.32.4
        github.com/jackc/pgconn v1.5.0
        github.com/jackc/pgx/v4 v4.6.0
        golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
        golang.org/x/text v0.3.3 // indirect
    )
    
    module gitlab.com/soteapps/packages/v2100
    
    go 1.14
    
    require (
        github.com/aws/aws-sdk-go v1.32.4
        github.com/jackc/pgconn v1.5.0
        github.com/jackc/pgx/v4 v4.6.0
        golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
        golang.org/x/text v0.3.3 // indirect
    )
    
    版本更改后的示例go.mod文件
    module gitlab.com/soteapps/packages
    
    go 1.14
    
    require (
        github.com/aws/aws-sdk-go v1.32.4
        github.com/jackc/pgconn v1.5.0
        github.com/jackc/pgx/v4 v4.6.0
        golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
        golang.org/x/text v0.3.3 // indirect
    )
    
    module gitlab.com/soteapps/packages/v2100
    
    go 1.14
    
    require (
        github.com/aws/aws-sdk-go v1.32.4
        github.com/jackc/pgconn v1.5.0
        github.com/jackc/pgx/v4 v4.6.0
        golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
        golang.org/x/text v0.3.3 // indirect
    )
    
    更改前导入Golang文件示例
    package sDatabase
    
    import (
        "context"
        "encoding/json"
        "fmt"
        "strings"
    
        "github.com/jackc/pgx/v4"
        "github.com/jackc/pgx/v4/pgxpool"
        "gitlab.com/soteapps/packages/sError"
        "gitlab.com/soteapps/packages/sLogger"
    )
    
    const (
    
    更改后导入Golang文件示例
    package sDatabase
    
    import (
        "context"
        "encoding/json"
        "fmt"
        "strings"
    
        "github.com/jackc/pgx/v4"
        "github.com/jackc/pgx/v4/pgxpool"
        "gitlab.com/soteapps/packages/v2020/sError"
        "gitlab.com/soteapps/packages/v2020/sLogger"
    )
    
    const (
    
    具有v2+版本号的项目:
  • 编辑go.mod模块行,将主版本号包含在现有模块路径的末尾。因此,上面的模块行
    module gitlab.com/soteapps/packages
    也将更改
    module gitlab.com/soteapps/packages/v2100
  • 项目中所有*.go文件中对
    gitlab.com/soteapps/packages
    的所有导入引用必须更新为
    gitlab.com/soteapps/packages/{version}
    。在我们的示例中,这将如下所示,
    gitlab.com/soteapps/packages/v2100
  • 将更改提交到源代码管理。
  • 如果您使用的是master,则提交给master。
  • 提交到master之后,从master创建一个版本名为的分支<在上述示例中,代码>v2100
  • 如果您正在使用分支,则提交到具有版本名的分支<在上述示例中,代码>v2100
  • 最后一步是使用指向版本分支的语义版本控制格式(vX.Y.Z)创建标记
    v2100.1.0
    将是本例的标记

  • 所以规则5说,“版本1.0.0定义了公共API。版本号在本次发布后增加的方式取决于此公共API及其变化方式。”。它并没有说1是可用的。此外,规则8规定“如果公共API中引入任何向后不兼容的更改,则主版本X(X.y.z | X>0)必须递增。它还可能包括次要和补丁级别的更改。当主版本递增时,补丁和次要版本必须重置为0。”也就是说,允许值大于1。继续。。。那么,“这是一种惯例,对每个人都很方便。Go模块选择使用广泛接受的语义版本控制v2。”如何符合语义版本控制的原则/指导。V2020.y.z是一个有效的语义版本。使用semver约定,go工具可以自动检测最新版本,并告知当前(本地)版本是否有可以在不破坏构建的情况下获取的更新,假设模块所有者遵循semver规则。版本
    v4.6.0
    与semver2兼容。
    v2020.0.0
    也与semver2兼容,只是不
    v2020
    。在Icza的帮助下(见下面的注释),我发现以下内容:重新阅读后,我发现问题与v2020.y.z无关,它的目录结构与版本号不匹配。路径abc/def/v2020-v2020.y.z应该可以工作。谢谢你的各种链接。一个很好的工作示例是github.com/jackc/pgx/v4。不要将版本号2020用于包/版本控制,因为这意味着存在许多早期版本