Go 1.5中的包版本管理

rau*_*ulk 5 go

我得到我的手脏一起去,虽然我理解和欣赏的原理简单说离开是在建,我想把握原理背后放弃一个内置的包版本的方法,在他们的依赖性取工具go get和该import声明.

如果我理解正确,go getimport从中获取包HEAD,他们无法引用分支或标记.虽然有像gopkg.in这样的工具来规避这种限制,官方工具链:

  1. 迫使开发人员为其产品的主要(破碎)版本创建单独的回购.
  2. 它不允许消费者在次要版本或微型版本之间降级,以防在新版本中发现错误.

说实话,事情并不那么容易,因为软件包版本控制需要一个策略来处理冲突的传递依赖,例如X取决于AB,每个依赖于不同的版本C.

来自Java背景,似乎这种限制带来了一些风险和问题,其中包括:

  1. 产品/包装的演变和第三方公共API的破坏是不可避免的,因此版本控制必须是工具链IMHO中的一等公民.

  2. Git的回购每版的政策是非常低效的:

    • 包的整体Git历史记录丢失或分散在repos(版本,backports等之间的合并)
    • 与传递依赖性的冲突可能仍然发生,并且将不会被检测到,因为语言和工具链强加任何语义以允许首先进行检测.
  3. 企业采用可能会受到阻碍,开发团队可能会回避语言,因为:

    • 总是拖入HEAD意味着他们无法控制或冻结他们的第三方代表,导致潜在的不可预测的最终产品.
    • 可能缺乏人力来保持他们的产品不断更新和测试上游HEAD(不是世界上每个公司都是谷歌:)).

虽然我确实理解后一种风险可以 - 并且必须 - 通过持续集成来缓解,但它并不能解决问题的根本原因.

我错过了哪些信息?在人力有限的企业中部署Go时,如何处理包上游变更?

icz*_*cza 7

它是由解决vendoring这是围棋1.5作为一个实验性功能的一部分,它可以在合格命令与运行启用GO15VENDOREXPERIMENT=1在其环境中,并会在Go 1.6"全"功能.另请参阅供应商目录.

可以在此处找到导致Go 1.5 Vedor实验的原始讨论.

vendoring的本质是您创建一个名为的文件夹vendor,然后放置代码所依赖的软件包的确切版本.里面的代码vendor文件夹仅通过在父根的目录树中的代码可导入vendor,您可以从导入包vendor与导入路径,仿佛vendor将是workspace/src文件夹(也就是,与省略了前缀长达一个导入路径并包括供应商元素).

例:

/home/user/goworkspace/
    src/
        mymath/
            mymath.go
            vendor/
                github.com/somebob/math
                    math.go
Run Code Online (Sandbox Code Playgroud)

在此示例中github.com/somebob/mathmymathpackage(from mymath.go)使用的外部包.mymath.go如果导入如下,则可以使用它:

import "github.com/somebob/math"
Run Code Online (Sandbox Code Playgroud)

(而不是import mymath/vendor/github.com/somebob/math哪个会坏.)