【问题标题】:Go Get, Git and DependenciesGo Get、Git 和依赖项
【发布时间】:2016-05-08 22:57:07
【问题描述】:

我是一名经验丰富的 Go 开发人员和 Git 用户,但有些事情我似乎无法理解。

通常我的团队使用.gitmodules 来表示包依赖关系,这是一个成功的模式,因为它指向一个精确的提交。整个“卖货问题”就这样为我们解决了。

但是,我最近创建了一个项目并使用 go get 从 GitHub 获取各种包,而不是使用 git submodule add。我完成了项目,将所有内容都提交到了我的 git repo,但是当一个队友克隆出 repo 时,依赖项的源代码丢失了。

通常我会说“哦,你忘了运行git submodule update --init”,但它们当然不是子模块。所以...我可以告诉他运行go get -u 或其他东西(对吗?)但这意味着我受依赖的主分支的支配——进入供应商。

我真正的问题是:当我go get 一个包然后将其提交到我的存储库时,实际上会发生什么?它没有提交到我的源代码树中,也不是子模块......我不知道它到底是什么! go get 和 Git 在这里的行为和交互的确切方式是什么?

奖金回合:您为什么想要这种行为?在什么情况下,您希望将另一个项目提交到您的 repo 中,以强制新签出每次都提取最新版本的源代码?

【问题讨论】:

  • 按照golang.org/doc/code.html#remote - go get <package-path> 将包保存到$GOPATH/src/<packagepath> - 即像全局 PYTHONPATH 一样的全局 GOPATH。当然,vendoring 解决了这个问题,并明确地将依赖项(及其版本)与项目捆绑在一起。
  • 您可以将 go vendoring 与子模块一起使用。 Golang 团队在 1.6 中修复了这个问题。这是他们的测试用例作为示例 github.com/rsc/go-get-issue-12612 go get 将检查 repo 及其所有子模块作为供应商包

标签: git go git-submodules


【解决方案1】:

基本上go get 下载并安装一个项目。它首先将您想要的项目的存储库克隆到 GOPATH 中。所以

go get github.com/foo/bar

等于

cd $GOPATH/src/github.com/foo
git clone git@github.com:foo/bar.git

这是一个自己的存储库。

从 go 1.5 开始,“供应商问题”以一种非常简洁优雅的方式得到解决,从 go 1.6 开始,它已成为标准方式(这只是 1.5 中的一个实验)。这样,您只需将您真正需要的(子)包(有时是单个文件)添加到项目的结构/存储库中。有一些工具可以处理供应商,包括godep,我们目前从它们切换到govendor。它具有非常棒的功能。其中之一是将项目中的依赖项更新为给定状态(提交、标记等),但您仍然可以拥有其他项目的包,您正在处理。
关于奖金问题......我害怕我有点困惑,害怕我不完全理解其中的问题,但我很乐意回答。

【讨论】:

  • 谢谢。也许我的问题总体上令人困惑;无论如何,你回答了一半。剩下的问题是当你将这样的仓库提交到伞式仓库而不是子模块时,Git 如何处理它。虽然现在我知道它只是一个clone,但我可能可以在某处找到答案。
  • 额外问题基本上是“为什么用于获取依赖项的工具不会以允许可重复构建的方式提交(或允许您提交)依赖项?”
  • 正如我所说,godep 是依赖工具,go get 不是。另外,我现在不太确定是否可以将一个 repo 提交到另一个 repo 中......他们每个人都有自己的 .git 目录......
  • “基本上 go get 只是克隆你想要的项目的存储库”这是错误的。 go get 将克隆项目及其所有依赖项并安装它们。所以奖金问题适用并且没有很好的答案 - 这可能是谷歌管理他们的代码库的方式。 Master总是很适合结账。当然,这在 Google 之外是行不通的,因此创建了用于销售的外部工具,并且在 Go 1.6 中,销售成为官方功能。并且兼容 git 子模块
  • @Havelock 知道使用 Git 执行此操作时的行为是什么什么吗?我的 Google-foo 让我失望了……也许这是一个明显的错误,没有人会认为你会尝试这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多