如何在github仓库的特定标签上“获取”


89

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

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

我已尝试做: go get github.com/influxdb/influxdb/releases/tag/v0.8.8但是失败说找不到。

我也试图做一个正规go get的主分支,然后手动检查出使用标签gitGOPATH/src/github...以设置corret版本。

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

TL; DRgo get在特定的github标记上执行,并提取正确的依赖项。


试试这个.. git tag -a v0.8.8-“您的评论”
Ashok Londhe,2015年

2
@AshokLondhe他在问如何将标签用于go get,而不是如何创建标签。
wonderb0lt

@ wonderb0lt这是添加标签的命令。
Ashok Londhe,2015年

我想我也尝试找出如何检出特定标签的方法,而上次尝试却无法做到……
wonderb0lt 2015年

1
看看这个。幻灯片的结尾部分提供了一些依赖项管理的替代方法。
wonderb0lt

Answers:


34

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

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

阅读更多:

Go 1.6中的供应商

供应商已经从go 1.6的实验版本中释放(最初写这篇文章之后),这使使用第三方工具使用特定标签/软件包版本的过程更加容易。go get仍不具备获取特定标签或版本的功能。

有关供应商如何工作的更多信息:了解和使用供应商文件夹

Go 1.11中的模块

Go 1.11发布了称为模块的实验性功能,以改善依赖关系管理,他们希望在Go 1.12中将其稳定发布:有关Go 1.11中模块的信息


1
您能详细说明一下Google部分吗?围棋社区的邮件列表上对此进行了大讨论,是否还有其他未讨论的方向?
Not_a_Golfer

1
@Not_a_Golfer这个人不属于Go团队,但谈到他们目前在内部使用供应商,而且体积很大。因此,他们有兴趣使用官方工具更好地解决它。认为这是一个非正式的声明,但会使其更加清楚。
罗宾·安德森

2
AFAIK,唯一的建议是使用正式的供应商/依赖文件格式。这仍然很棒,因为项目不会与依赖工具绑定,并且可以与所需的任何解决方案进行互操作(即,我更喜欢修订锁定,而其他人更喜欢供应商)。
JimB 2015年

模块实际上并没有处理对代码编译器的依赖,这迫使我们在其他带有修订版本的地方使用go get protoc-gen-go。因此,我们需要在2个不同的地方跟踪相同的版本(因为库与生成器紧密耦合)
Martin Kosicky

24

go mod 现在可用。

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

mkdir temp
cd temp
go mod init .
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与修订版/标签一起使用。(请参阅此链接
  • -d 表示“仅下载”,如果要直接安装,请忽略此标志以及此行下方的build命令。
  • -v 表示“冗长”。
  • 上面的代码适用于Windows。如果您使用Linux,请替换bin/nsqd.exebin/nsqd

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


4
在Go 1.13中,go mod init需要一个模块ID,例如go mod init local/build
Archie

11

我已经成功地做到了:

  • 运行不带标签的get命令-它应该克隆master分支。
  • 移至克隆目录并签出所需的标签或分支。
  • 再次运行go get命令,它应该在检出的分支上处理该命令。

4
在第一次运行时,您可以go get -d <git-url>只下载软件包并跳过安装。
webwurst

当您需要特定的标签时,应使用此方法,gopkg.in的限制太多。
Hrishikesh Kumar

3

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

go get github.com/influxdb@[version]

或获取特定的git标签:

go get github.com/influxdb@[gitref]


1

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

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

现在,我可以使用新的go包来提交并推送到GOPATH-repo。当我的队友从该仓库中取出git子模块进行更新时(或者只是通过SoureTree进行更新,后者会自动执行此更新),则他们的软件包版本会在与我相同的标签上签出。

当然,这仅适用于git源代码控制下的软件包。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.