【问题标题】:How to do "go get" on a specific tag of a github repository如何在 github 存储库的特定标签上执行“go get”
【发布时间】:2015-07-23 04:29:13
【问题描述】:

我正在尝试使用 go get github.com/influxdb/influxdb 编译 InfluxDB 数据库(版本 v0.8.8)

但这会拉出 master 分支,我需要 v0.8.8 标签。

我尝试过这样做:go get github.com/influxdb/influxdb/releases/tag/v0.8.8 但这失败了,说找不到。

我还尝试对master分支进行常规go get,然后在GOPATH/src/github...中使用git手动签出标签以设置正确的版本。

使用最后一种方法的问题是,当我尝试使用 go get -u -f ./... 拉取依赖项时,它会尝试在 master 分支中找到它们,而其中一些在 master 分支上不存在...

TL;DR:在特定的 github 标签上执行go get,并拉取正确的依赖项。

【问题讨论】:

  • 试试这个.. git tag -a v0.8.8 -"你的评论"
  • @AshokLondhe 他问的是如何为go get 使用标签,而不是如何创建标签。
  • @wonderb0lt 这是添加标签的命令。
  • 我想我也尝试找出如何检查特定标签,而上次我尝试它是不可能的......
  • 看看this。幻灯片接近尾声提供了一些依赖管理替代方案。

标签: git go github


【解决方案1】:

无法使用go get 工具。相反,您需要使用第三方 go 包管理工具或为您希望更细粒度地管理的包创建自己的分支。

与一位在 Google 工作的人交谈,他承认了这个问题/要求,他说他的团队使用的供应商很庞大,他们可能很快就会用官方工具解决这个问题。

了解更多:

Go 1.6 中的供应商

供应商一直是released from experimental in go 1.6(在最初撰写这篇文章之后),这使得使用第三方工具使用特定标签/版本的包的过程更容易。 go get 仍然没有获取特定标签或版本的功能。

更多关于供应如何运作:Understanding and using the vendor folder

Go 1.11 中的模块

Go 1.11 发布了一个名为 modules 的实验性功能来改进依赖管理,他们希望在 Go 1.12 中稳定地发布它:Information about modules in Go 1.11

【讨论】:

  • 您能详细说明一下 google 部分吗?在 go 社区的邮件列表上对此进行了很大的讨论,还有其他没有讨论的方向吗?
  • @Not_a_Golfer 这是一个不属于 Go 团队的人,但他谈到他们目前在内部使用 vendoring 并且非常庞大。所以他们有兴趣使用官方工具更好地解决这个问题。认为这是一个非官方的声明,但会更清楚。
  • AFAIK,唯一的建议是官方供应商/依赖文件格式。这仍然很棒,因为项目不会绑定到依赖工具,并且可以与他们想要的任何解决方案互操作(即我更喜欢修订锁定,而其他人更喜欢供应商)。
  • 模块并没有真正处理对代码编译器的依赖,这迫使我们在其他地方使用 go get protoc-gen-go 修复版本。因此,我们需要在 2 个不同的地方跟踪相同的版本(因为库与生成器紧密耦合)
【解决方案2】:

至少对于 git 存储库,我有一种(有点骇人听闻,但有效)的方法来解决这个问题:由于 go get'ed 包是正常的源代码控制存储库,因此可以使用普通的 git 工具检查标签(可以使用 git从命令行,我使用的是 Atlassian SourceTree)。

为了与我的队友分享我的包配置,我在我的 GOPATH 中创建了一个 git 存储库。然后,我将所有包(至少是我想以这种方式管理的包)作为 git 子模块添加到这个 repo 中。这要求您将现有的 repo 文件夹移开,并将它们重新添加为 git 子模块,以免混淆 git。这个过程有点乏味,但事实证明是值得的:

我现在可以在每次使用新的 go 包时提交并推送到我的 GOPATH-repo。当我的队友从这个 repo 中提取并发布 git 子模块更新(或简单地通过 SoureTree 更新,它会自动执行此操作)时,他们的包版本会在与我相同的标签上签出。

当然这只适用于 git 源代码控制下的包...

【讨论】:

    【解决方案3】:

    我已经成功了:

    • 运行不带标签的 get 命令 - 它应该克隆 master 分支。
    • 移动到克隆目录并签出您想要的标签或分支。
    • 再次运行 go get 命令,它应该处理签出分支上的命令。

    【讨论】:

    • 第一次运行时,您可以使用go get -d <git-url> 来下载软件包并跳过安装。
    • 当你需要一个特定的标签时应该使用这个,gopkg.in 太严格了。
    【解决方案4】:

    maven golang plugin 允许在 GET 期间玩分支、标签和修订,你可以看看its test for such cases with GIT repository

    【讨论】:

      【解决方案5】:

      go mod 现在可用。

      对于那些需要构建特定标签的二进制文件的人,这是我的方式:

      mkdir temp
      cd temp
      go mod init local/build  # or `go mod init .` before go 1.13
      go get -d -v github.com/nsqio/nsq@v1.1.0
      mkdir bin
      go build -o bin/nsqd.exe github.com/nsqio/nsq/apps/nsqd
      

      解释:

      • 以上代码拉取NSQ v1.1.0并构建nsqd
      • go mod init . 在当前目录中创建一个go.mod 文件,这使得go get 能够与修订/标签一起使用。 (见this link
      • -d 表示“仅下载”,如果您想直接安装,请忽略此标志和此行下方的构建命令。
      • -v 表示“冗长”。
      • 以上代码适用于 Windows。如果您使用 Linux,请将 bin/nsqd.exe 替换为 bin/nsqd

      下载的模块存储在%GOPATH%\pkg\mod。如果您不想污染您的GOPATH 目录,请创建一个新目录并将您的GOPATH 设置为该目录。

      【讨论】:

      • 在 go 1.13 中,go mod init 需要一个模块 ID,例如go mod init local/build
      【解决方案6】:

      这个问题早于Go Modules,但为了将来参考,Go 1.11 中获取特定版本的正确过程是这样的:

      go get github.com/influxdb@[version]
      

      或者获取特定的git标签:

      go get github.com/influxdb@[gitref]
      

      【讨论】:

        【解决方案7】:

        要更新 GO api 的版本,请按照以下步骤操作。

        例如,我想将以下 api 更新为特定标签。

        实际回购:https://github.com/fraugster/parquet-go

        标签:https://github.com/fraugster/parquet-goreleases/tag/v0.5.0

        进入你的根目录

        go get -u https://github.com/fraugster/parquet-go@v0.5.0 `

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-15
          • 1970-01-01
          • 2016-04-29
          • 2022-10-06
          • 1970-01-01
          • 2020-08-20
          • 2019-04-28
          相关资源
          最近更新 更多