【发布时间】:2017-08-03 08:41:30
【问题描述】:
我有 2 个存储库。假设他们是 repo_a 和 repo_b。我在 repo_b 中导入了 repo_a
当我运行 go get 时,它会得到 repo_a master 分支。 有没有办法使用 go get 或 repo_b 中的其他命令获取开发分支?
我不想对每个特定的包进行 git pull(在本例中为 repo_a)
【问题讨论】:
我有 2 个存储库。假设他们是 repo_a 和 repo_b。我在 repo_b 中导入了 repo_a
当我运行 go get 时,它会得到 repo_a master 分支。 有没有办法使用 go get 或 repo_b 中的其他命令获取开发分支?
我不想对每个特定的包进行 git pull(在本例中为 repo_a)
【问题讨论】:
从 Go 1.11 开始,当使用 Go modules 时,这是可能的。在为 Go 模块安装依赖项时,您可以指定 module query,其中可能包含分支或标记名称:
$ go get <path-to-repo>@<branch>
【讨论】:
纯go get是不可能的。
Go 采用了所有包管理器中最简单、最实用的方法。 Go 包不存在多个版本。
但这并没有第一眼看上去那么糟糕,因为这种行为背后存在一种哲学。
作为包作者,你必须坚持稳定的 HEAD 理念。您的默认分支必须始终是您的软件包的稳定发布版本。您必须在功能分支中工作,并且只有在准备好发布时才合并。
这种方法是受go get 限制所强制,应该像 Python 缩进一样对待 - 这是一种语言设计所强制的哲学。
如果你想分叉一些东西或尝试新功能,你可以克隆 repo,然后切换到所需的分支并执行go build。这种方式不应该投入生产。
git clone <repo name>
cd <repo name>
git checkout <branch name>
go build
您还可以使用第三方包管理工具。但是它们中的大多数都支持标签和修订,而不是分支(因为暗示您不需要安装功能分支)。
gpm:
您可以使用格式指定包,其中版本可以是修订号(git/bazaar/mercurial/svn 修订哈希)或标签。
【讨论】:
你可以使用gopkg.in,它会重定向到github。
支持两种 URL 模式:
gopkg.in/pkg.v3 → github.com/go-pkg/pkg (branch/tag v3, v3.N, or v3.N.M)
gopkg.in/user/pkg.v3 → github.com/user/pkg (branch/tag v3, v3.N, or v3.N.M)
go get gopkg.in/pkg.v3 表示go get github.com/go-pkg/pkg,但是是分支或标签v3.*。
详情请见here
【讨论】: