亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 1.5 中的包版本管理

Go 1.5 中的包版本管理

Go
慕蓋茨4494581 2021-12-07 10:22:36
我開始接觸 Go,雖然我理解并欣賞Go 所基于的簡單原則,但我想了解在他們的依賴獲取工具中放棄內置包版本控制方法背后的基本原理go get和該import聲明。如果我理解正確,go get并import從中獲取包HEAD,他們將無法引用分支或標簽。雖然有像gopkg.in這樣的工具可以繞過這個限制,但官方工具鏈:強制開發人員為其產品的主要(破壞性)版本創建單獨的存儲庫。它不允許消費者在小版本或微型版本之間降級,以防在較新的版本中發現錯誤。說實話,事情并沒有那么容易,因為包版本控制需要一種策略來處理沖突的傳遞依賴關系,例如X依賴A和B,每個依賴于不同版本的C.從 Java 背景來看,這個限制確實帶來了一些風險和問題,其中包括:產品/包的演變和 3rd 方 deps 公共 API 的損壞是不可避免的,因此版本控制必須是工具鏈中的一等公民恕我直言。在Git的回購每版的政策是非常低效的:包的整體 Git 歷史丟失或分散在存儲庫中(版本、向后移植等之間的合并)與傳遞依賴的沖突可能仍然會發生,并且不會被檢測到,因為語言和工具鏈首先強加了任何允許檢測的語義。鑒于以下情況,企業采用可能會受到阻礙,開發團隊可能會回避該語言:總是拖延HEAD意味著他們無法控制或凍結他們的第 3 方部門,從而導致可能無法預測的最終產品??赡苋狈θ肆肀3炙麄兊漠a品不斷更新和與上游的測試HEAD(并非世界上的每家公司都是谷歌:))。雖然我確實理解后一種風險可以——而且必須——通過持續集成來減輕,但它并沒有解決問題的根本根源。我缺少什么信息?在人力有限的企業中部署 Go 時,如何處理包上游變化?
查看完整描述

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會很糟糕。)


查看完整回答
反對 回復 2021-12-07
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

雖然 Go 沒有標準包管理器,但有足夠的選項來使構建可重現(即使在人力有限的企業中)。

  1. 供應商,@icza 在另一個答案中對此進行了描述。這幾乎完全等同于在 Java 中檢入版本控制的 jar 文件。在 maven 流行之前,這是 ant 構建工具非常常見的方法。實際上vendoring要好得多,因為您不會丟失源代碼。

  2. 這是第一個選項的細微變化。您可以在構建期間通過檢查依賴項的預定義版本來填充 vendor 文件夾,而不是檢查 vendored 源代碼。有一些工具(例如滑翔)可以自動化這個過程。

  3. 最后,您可以在內部存儲庫中維護所有第 3 方庫的預定義版本并將其添加到 GOPATH。這種方法在https://blog.gopheracademy.com/advent-2015/go-in-a-monorepo/中有詳細描述

請注意,不兼容的傳遞依賴不是 Go 特有的。它們也存在于 Java(和大多數其他語言)中,盡管 Java 有一種機制可以通過使程序更復雜來部分解決這個問題——類加載器。請注意,Go 將在編譯時報告所有不兼容性,而在 Java 中,某些不兼容性僅在運行時觸發(因為后期鏈接)。

Java 工具鏈沒有版本的概念。它由外部工具 - maven 提供。我相信當 Go 變得更加成熟和流行時,將會出現一個類似的標準依賴管理工具。


查看完整回答
反對 回復 2021-12-07
  • 2 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號