供应Golang共享存储库

时间:2016-10-21 03:50:20

标签: go

尝试从传统的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:

  • 优点:

    • 可重复构建
    • 与CI轻松集成
  • 缺点:

    • 手动和错误容易 - 容易供应商错误代码
    • 工程师需要有关供应商工具和方法的正确知识

Symlink Repo C trunk分支到A&的供应商文件夹中B:

  • 优点:

    • 工程师不需要了解供应商工具
    • 低开发者维护
  • 缺点:

    • 构建不(轻松)可重现
    • 在不应发布的构建中包含代码的可能性
    • 灵活性较低(Repo A和Repo B不能有不同版本的C)

在Repo A和Repo B中包含Repo C作为git子模块或子树(使用或不使用供应商):

  • 优点:

    • 工程师不需要了解供应商工具
    • 简易设置
    • 减少维护
    • 可重复构建
  • 缺点:

    • 必须使用git子模块或子树

在互联网上找到关于这个问题的惊人一点。是否有一些惯用的方法呢?我确信还有其他方法可以做到这一点;我错过了什么?

1 个答案:

答案 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 initgit commit -am 'glide init'git push

回购A,glide initglide get git@repo.com/repocgit commit -am 'glide init'git push

回购B,glide initglide get git@repo.com/repocgit commit -am 'glide init'git push

最后,项目A,glide initglide get git@repo.com/repoaglide get git@repo.com/repobgit commit -am 'glide init'git push

要重新安装项目glide installgo build

为了在执行远程安装时跳过glide install命令,没有什么可以阻止您使用其vendor文件夹来压缩ProjectA。

但是您通常不想为开发环境提交vendor文件夹。您通常会在vendor/文件中添加.gitignore并运行glide installglide update

在开始时遇到一些困难,通过这一步,事情就会奏效。

一旦您跳转到该工作流程,请注意您必须对您的回购中的所有更改进行修改。

当您同时使用项目A和回购B来实现可行的更改时,这就是英国媒体报道软件,所以在这种情况下,不要将repoB出售到项目A中(您可以保留清单定义,但可以将repoB文件夹放入供应商/),使用go命令将repoB安装为go get模块。 这样做的更改将在重新构建时立即生效。完成更改集后,浏览每个仓库并适当地碰撞它们。

最后,您可能希望使用版本保险杠来帮助您快速,快速地完成任务,我发现one用于个人用途。

希望这会有所帮助。