2 回答
TA贡献1829条经验 获得超4个赞
它正在由作为 Go 1.5 的一部分作为实验性功能的vendoring解决,如果 go 命令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
在此示例中github.com/somebob/math是mymath包 (from mymath.go)使用的外部包。mymath.go如果它是像这样导入的,则可以使用它:
import "github.com/somebob/math"
(而不是那样import mymath/vendor/github.com/somebob/math会很糟糕。)
TA贡献1831条经验 获得超9个赞
虽然 Go 没有标准包管理器,但有足够的选项来使构建可重现(即使在人力有限的企业中)。
供应商,@icza 在另一个答案中对此进行了描述。这几乎完全等同于在 Java 中检入版本控制的 jar 文件。在 maven 流行之前,这是 ant 构建工具非常常见的方法。实际上vendoring要好得多,因为您不会丢失源代码。
这是第一个选项的细微变化。您可以在构建期间通过检查依赖项的预定义版本来填充 vendor 文件夹,而不是检查 vendored 源代码。有一些工具(例如滑翔)可以自动化这个过程。
最后,您可以在内部存储库中维护所有第 3 方库的预定义版本并将其添加到 GOPATH。这种方法在https://blog.gopheracademy.com/advent-2015/go-in-a-monorepo/中有详细描述
请注意,不兼容的传递依赖不是 Go 特有的。它们也存在于 Java(和大多数其他语言)中,尽管 Java 有一种机制可以通过使程序更复杂来部分解决这个问题——类加载器。请注意,Go 将在编译时报告所有不兼容性,而在 Java 中,某些不兼容性仅在运行时触发(因为后期链接)。
Java 工具链没有版本的概念。它由外部工具 - maven 提供。我相信当 Go 变得更加成熟和流行时,将会出现一个类似的标准依赖管理工具。
- 2 回答
- 0 关注
- 196 浏览
添加回答
举报