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 關注
- 228 瀏覽
添加回答
舉報