草庐IT

go - 供应 Golang 共享存储库

coder 2023-07-01 原文

尝试从旧版 Godeps 工作流迁移到官方支持的 Golang vendor 解决方案。

场景:

Repo A===
         \
           ========> Repo C (shared library code)
         /  
Repo B===

对于中型(大约 5-10 名成员)工程师团队,我可以为 Repo A 和 Repo B vendor Repo C 选择什么最佳工作流程?能力各异的工程师,其中大多数可能根本不需要知道这方面的细节?

我目前正在为此使用 govendor。我宁愿不切换,但如果有一种工具可以提供更好的工作流程,我会这样做。

这需要与运行构建的 CI 服务器集成。我可以想到 3 种情况:

vendor repo C 到 A 和 B:

  • 优点:

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

    • 手动且容易出错 - 很容易供应不正确的代码
    • 工程师需要充分了解 vendor 的工具和方法

Symlink Repo C 主干分支到 A 和 B 的 vendor 文件夹中:

  • 优点:

    • 工程师不需要了解 vendor 工具
    • 开发人员维护成本低
  • 缺点:

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

将 Repo C 作为 git 子模块或子树包含在 Repo A 和 Repo B 中(无论是否使用 vendor ):

  • 优点:

    • 工程师不需要了解 vendor 工具
    • 设置简单
    • 减少维护
    • 可重现的构建
  • 缺点:

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

令人惊讶的是,在互联网上几乎找不到关于这个问题的资料。有一些惯用的方法吗?我敢肯定还有其他方法可以做到这一点;我错过了什么?

最佳答案

我建议使用具有版本约束的基于 list 的方法。

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 -> >=1.0.1 < 2.0.0 .

请注意,您并非被迫使用波浪号和插入符等“助手”,您可以定义明确的版本范围。

您应根据您给予远程作者正确升级其版本号的信心水平来决定应用哪个约束。

最后,您可以使用 glide 为您解决。

从 Repo C 开始,假设您已经标记了 repos,运行 glide init , git commit -am 'glide init' , git push

repo A,glide init , glide get git@repo.com/repoc , git commit -am 'glide init' , git push

repo 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 命令,没有什么能阻止您将 ProjectA 与它的 vendor 文件夹打包在一起。

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

预计开始时会遇到一些困难,通过那一步,事情就会成功。

一旦您跳转到该工作流程,请注意,您必须在您的存储库中添加所有更改。

当您同时处理项目 A 和存储库 B 以实现可行的更改时,这就是过时软件,因此在这种情况下,不要将存储库 vendor 提供给项目 A(您可以保留 list 定义,但将存储库文件夹放入 vendor/),将 repoB 安装为 go模块与 go get命令。 这样做,更改会在重建时立即生效。更改集完成后,浏览每个存储库并适本地碰撞它们。

最后,您可能想使用版本缓冲器来帮助您快速完成它,碰巧我做到了 one供我个人使用。

希望这对您有所帮助。

关于go - 供应 Golang 共享存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168086/

有关go - 供应 Golang 共享存储库的更多相关文章

  1. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  2. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  3. ruby - 如何使用 cucumber 在场景之间共享状态 - 2

    我有一个功能“从外部网站导入文章”。在我的第一个场景中,我测试从外部网站导入链接列表。Feature:ImportingarticlesfromexternalwebsiteScenario:Searchingarticlesonexample.comandreturnthelinksGiventhereisanImporterAnditsURLis"http://example.com"Whenwesearchfor"demo"ThentheImportershouldreturn25linksAndoneofthelinksshouldbe"http://example.com/d

  4. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  5. ruby - Sinatra 路由中定义的全局变量是否在请求之间共享? - 2

    假设我有:get'/'do$random=Random.rand()response.body=$randomend如果我每秒有数千个请求到达/,$random是否会被共享并“泄漏”到上下文之外,或者它会像getblock的“本地”变量一样?我想如果它是在get'/'do的上下文之外定义的,它确实会被共享,但我想知道在ruby​​中是否有我不知道的$机制。 最佳答案 ThispartoftheSinatraREADMEaboutscopeisalwayshelpfultoread但是,如果您只需要为请求保留变量,那么我认为我建议使用

  6. ruby - 跨线程共享枚举器 - 2

    我想从不同线程调用一个公共(public)枚举器。当我执行以下操作时,enum=(0..1000).to_enumt1=Thread.newdopenum.nextsleep(1)endt2=Thread.newdopenum.nextsleep(1)endt1.joint2.join它引发了一个错误:Fibercalledacrossthreads.当enum在从t1调用一次后从t2调用时。为什么Ruby设计为不允许跨线程调用枚举器(或纤程),以及是否有其他方法可以提供类似的功能?我猜测枚举器/纤程上的操作的原子性在这里是相关的,但我不完全确定。如果这是问题所在,那么在使用时独占锁定

  7. ruby - 两个 gem 共享相同的要求? - 2

    当我打电话时:require'retryable'这两个gem冲突:https://github.com/robertsosinski/retryablehttps://github.com/carlo/retryable因为他们都有一个“可重试”文件,所以他们要求用户要求。我对使用第一个gem很感兴趣,但这并不总是会发生。这段代码作为我自己的gem的一部分执行,它必须对所有用户都是可靠的。有没有办法从gem中专门要求(因为gem名称当然不同)?如何解决这个命名冲突?编辑:澄清一下,这是官方仓库,gem名称实际上是不同的(“retryable-rb”和“carlo-retryable”

  8. ruby - ActiveRecord - 在连接模型中查找具有共享属性的所有对象 - 2

    我有三个模型classBoat我正在尝试编写一个简单的ActiveRecord查询来查找所有帆船类型的船。类似于Boat.where(classifications:"Sailboat") 最佳答案 我认为这可行:Boat.joins(:classifications).where(classifications:{name:'Sailboat'})#nameorwhateverfieldcontainsSailboat生成此查询:SELECT`boats`.*FROM`boats`INNERJOIN`boat_classifica

  9. ruby-on-rails - 未从 css 文件 Heroku 和 S3 引用 Rails 4 供应商 Assets 图像 - 2

    我在供应商css文件引用的供应商文件夹下有很多供应商图像。我正在使用Heroku和S3进行生产,像background-image:url("../images/sprite.png");之类的东西正在开发中,但不在生产中,因为图像url指向S3url。它也没有被预编译,所以不确定我是否应该将它作为Assets预编译的一部分,但我想远离它,因为我需要手动将所有图像文件复制到assets/images文件夹并更改css文件中的引用,方法是将其更改为scss和asset_url(这似乎工作正常)有没有办法只从供应商css文件中引用S3url我还使用asset_syncgem上传到S3

  10. ruby-on-rails - Ruby on Rails 私有(private)链接共享 : Google Docs Style - 2

    如果要让用户能够共享一个私有(private)链接,让任何点击它的人都能查看具有隐私限制的特定页面/文档/项目,最好的方法是什么?以我为例:用户创建的事件仅限于数据库中某些关系组(即:friend、friend的friend等)我在事件Controller中有一个:before_filter检查资格当前登录用户的权限,以确保该用户有权查看该事件。如果他们不这样做,他们将被引导到根页面并显示一条错误消息。但是,我希望存在一个特殊场景,用户可以使用相同的隐私设置创建一个事件,此外,还可以通过电子邮件、Facebook等方式与他或她的friend分享一个特殊链接。那些用户不需要帐户(但需要创

随机推荐