Go Get,Git和Dependencies

时间:2016-05-08 22:57:07

标签: git go git-submodules

我是一位经验丰富的Go开发人员和Git用户,但我似乎无法解决这些问题。

通常我的团队使用.gitmodules来获取包依赖关系,这是一个成功的模式,因为它指向一个确切的提交。整个"销售问题"已经以这种方式为我们解决了。

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

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

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

奖金回合:你为什么要这样做?您希望在什么情况下将另一个项目提交到您的仓库中,以便强制新的检出每次都能获取最新版本的源?

1 个答案:

答案 0 :(得分:5)

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

go get github.com/foo/bar

等于

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

这是它自己的存储库。

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