尝试从传统的Godeps工作流程转向官方支持的Golang vendoring解决方案。
情景:
Repo A===
\
========> Repo C (shared library code)
/
Repo B===
对于中型(约5-10名成员)工程师团队,我们可以为Repo A和Repo B选择供应商Repo C的最佳工作流程是什么?具有不同能力的工程师,其中大部分可能根本不需要知道这个细节?
我目前正在使用govendor。我宁愿不切换,但如果有一个工具可以提供更好的工作流程。
这需要与运行构建的CI服务器集成。我可以想到3个场景:
供应商回购C进入A& B:
优点:
缺点:
Symlink Repo C trunk分支到A&的供应商文件夹中B:
优点:
缺点:
在Repo A和Repo B中包含Repo C作为git子模块或子树(使用或不使用供应商):
优点:
缺点:
在互联网上找到关于这个问题的惊人一点。是否有一些惯用的方法呢?我确信还有其他方法可以做到这一点;我错过了什么?
答案 0 :(得分:1)
我建议使用基于清单的方法和版本约束。
Project A == Manifest
|- Repo A@~1.0.1
|- Repo B@~1.0.1
Repo A == Manifest
|- Repo C@~1.0.1
Repo B == Manifest
|- Repo C@~1.0.5
Repo C == Manifest empty
将解析为
Project A == Resolved Manifest
|- Repo A@1.0.1
|- Repo B@1.0.1
|- Repo C@1.0.5
其中~1.0.1
表示>=1.0.1 <1.1.0
。
如您所见,B和A对C的依赖是独立的,但在项目中它们是正确解析的。
如果A和B将C语言定义为不兼容的依赖项,则应该发生错误,因为项目不应该是可构建的。
您可能更喜欢使用插入符^
而不是使用~
,^1.0.1
- &gt; >=1.0.1 < 2.0.0
。
请注意,您不会被迫使用这样的'助手',例如代字号和插入符号,您可以定义显式版本范围。
鉴于您给予远程作者正确升级其版本号的信任程度,您应决定应用哪个约束。
最后,你可以使用滑行为你解决这个问题。
从回购C开始,假设您已经标记了回购,请运行glide init
,git commit -am 'glide init'
,git push
回购A,glide init
,glide get git@repo.com/repoc
,git commit -am 'glide init'
,git push
回购B,glide init
,glide get git@repo.com/repoc
,git commit -am 'glide init'
,git push
最后,项目A,glide init
,glide get git@repo.com/repoa
,glide get git@repo.com/repob
,git commit -am 'glide init'
,git push
要重新安装项目glide install
,go build
。
为了在执行远程安装时跳过glide install命令,没有什么可以阻止您使用其vendor文件夹来压缩ProjectA。
但是您通常不想为开发环境提交vendor文件夹。您通常会在vendor/
文件中添加.gitignore
并运行glide install
或glide update
。
在开始时遇到一些困难,通过这一步,事情就会奏效。
一旦您跳转到该工作流程,请注意您必须对您的回购中的所有更改进行修改。
当您同时使用项目A和回购B来实现可行的更改时,这就是英国媒体报道软件,所以在这种情况下,不要将repoB出售到项目A中(您可以保留清单定义,但可以将repoB文件夹放入供应商/),使用go
命令将repoB安装为go get
模块。
这样做的更改将在重新构建时立即生效。完成更改集后,浏览每个仓库并适当地碰撞它们。
最后,您可能希望使用版本保险杠来帮助您快速,快速地完成任务,我发现one用于个人用途。
希望这会有所帮助。