GoCenter助力Golang全速前進

JFrog傑蛙科技發表於2020-01-08

一、背景

Go語言是Google開發的一種靜態強型別、編譯型、併發型,並具有垃圾回收功能的程式語言。為了方便搜尋和識別,有時會將其稱為Golang。自2009年11月Google正式宣佈推出,成為開放原始碼專案以來,Go語言已成為當今開發人員和DevOps領域最流行的語言之一, 它被用於設計和編寫Kubernetes和Helm。但是,相比語言本身已經得到了廣泛的普及和使用,Go語言的包管理方案卻大大滯後了。

Go語言生態系統中缺少的是標準化——沒有用於依賴關係管理的標準工具, 也沒有標準的包格式或相容的包倉庫規範。這意味著開發人員無法使用Go語言建立可重現的構建, 這是一個相當大的問題。這些年來, 社群推出了諸如dep、godep、glide和govender等工具,試圖用來處理Go語言的依賴管理, 但並未成功。2018年Google在Go1.11官方推出了Go modules,為Go語言提供了支援版本化的依賴管理方案。

Go modules現在已成為Go語言標準的依賴管理工具和包倉庫規範。而GoCenter為Go modules的實現和推廣提供了依賴包的公共倉庫,使得Go語言的開發人員能夠更為穩定和方便地開發可重複構建的Go應用程式。


二、 Go 語言的依賴管理

在介紹GoCenter之前,我們先簡要地回顧一下Go語言依賴管理的發展歷程。

Go語言在推出之初,並沒有明確的依賴管理方案。只是在構建過程中透過go get命令,將用import宣告的依賴從對應的源,通常是git上的專案,下載到$GOPATH/src目錄下,和Go應用自身的程式碼放在一起。這種依靠GOPATH來管理依賴的機制帶來的問題 是顯而易見的,比如:

·        因源依賴包自身的變化,導致不同時間構建Go應用時go get得到的依賴實質上是不同的,即不能實現可重複的構建;

·        或者因源依賴包自身的變化,重新構建Go應用時會引入不相容的新實現,導致Go應用無法透過編譯。

因此在1.5版本以前,為了規避這個問題,通常需要將使用的依賴包手工複製出來。

為了實現Go應用的可重複構建,Go1.5引入了Vendor機制。Vendor機制的核心就是在GOPATH下面增加了vendor資料夾。Go應用所需的依賴都可以從依賴源fork出所需的分支,存放到vendor資料夾。當構建Go應用時,Go編譯器會優先在vendor資料夾下搜尋依賴的第三方包,vendor資料夾下沒有才會再到$GOPATH/src下去找。這樣只要開發者預先將特定版本的依賴包存放在vendor資料夾,並提交到Go 專案的code repo,那麼所有人理論上都會得到同樣的編譯結果,從而實現可重複構建。 在Go1.5釋出後的若干年,Go社群把注意力都集中在如何利用Vendor機制解決Go應用的依賴管理問題,並誕生了眾多的依賴管理工具,如dep、golide、govendor等。然而,和Java的Maven、Python的Pypi、C/C++的Conan等業界成熟的依賴管理方案相比,Vender機制仍然存在許多問題,比如:

·        Vendor資料夾中的依賴包沒有版本資訊。這樣依賴包脫離了版本管理,對於一致性管理、升級,以及問題追溯等場景,都會難以處理;

·        Vendor機制沒有給出如何能夠方便地得到Go專案依賴了哪些包,並將其複製到vendor資料夾下的方案,多數情況下還需要到不同的Git源專案裡手工複製;

·        當依賴的包比較多的時候,vendor資料夾也會變得非常龐大。

2018年年初,Go核心Team的技術leader,也是Go Team最早期成員之一的 在 上連續發表了 ,系統闡述了Go team解決“包依賴管理”的技術方案: 。vgo的主要思路包括:語義匯入版本控制(Semantic Import Versioning)、最小版本選擇(Minimal Version Selection)、以及 等。同年5月份,Russ Cox的 被社群接受, ,並將這套機制正式命名為“go modules”。由於vgo專案本身就是一個實驗原型,merge到主幹後,vgo這個術語以及vgo專案的使命也就此結束了。後續Go modules機制將直接在Go主幹上繼續演化。

Go modules機制的主要變化包括:

·        去除了飽受詬病的GOPATH的限制。Go編譯器將不再到GOPATH下面的vendor或src資料夾下搜尋Go應用構建依賴的第三方包;

·        Go modules機制為在同一應用repo下面的包賦予了一個新的抽象概念: 模組(module),即可重用的Go程式碼包,並啟用一個新的檔案go.mod記錄模組的元資訊和依賴關係。而在go.mod裡明確描述了依賴包的版本資訊,同一個依賴包也可以記錄多個不同的版本。除了精確版本外,go.mod還支援用表示式模糊地定義依賴版本;

·        在Go modules機制下,還支援建立Go依賴包的公共倉庫。這是因為應用程式包含的Go模組,必須從數千個獨立的原始碼儲存庫中解析,而每個儲存庫的維護紀律可能各不相同。因此,需要存在一個可公開訪問的儲存庫,透過Go modules提供的依賴描述、解析機制,為Go的開發者提供一致的、可分享的、支援重複構建的、穩定的Go依賴包源。GoCenter就是這種Go依賴包公共倉庫的重要實現。


三、 GoCenter 簡介

GoCenter透過建立Go模組的公共中央倉庫,提供可重複和快速依賴解析的依賴包管理方案,解決了Go開發人員查詢和獲取Go依賴包的困難。GoCenter將直接從原始碼儲存庫獲取Go專案,轉變為處理和驗證不可變的、具備版本控制的Go模組, 並將其免費提供給Go應用的開發人員。

GoCenter()提供了透過公共Go代理解析模組, 包括透過託管免費服務搜尋模組的能力。從建立開始, GoCenter已經包括了數千個廣受歡迎的 Go專案的模組, Go開發者可以立即使用這些專案進行自己的構建。


開發人員也可以提交自己的Go專案加入GoCenter,以便將其提供給Go社群開發者,從而得到更為廣泛地應用。



GoCenter這個中央倉庫,提供了預先打包,以及版本化的Go模組,使得Go開發人員或團隊不再需要為使用公共模組而構建自己的模組庫, 從而消減了使用 Go 語言的巨大成本。

此外,如果Go開發者或團隊已經有了自己的JFrog Artifactory倉庫,就可以透過配置指向GoCenter的遠端倉庫,為重複構建提供完全的本地化控制,並可以預防訪問GoCenter的網路連線問題。


四、基於 GoCenter 構建 Go 應用

要構建Go應用專案,首先需要安裝Go客戶端(版本1.11.0 或更新的版本) 。而安裝Go之後,有三種方法可以從GoCenter解析Go模組:使用goc、使用 go 客戶端,或部署本地倉庫(如Artifactory),以代理GoCenter。

1、使用goc

推薦在構建中使用GoCenter的方式是透過goc工具。goc工具包裝了Go的客戶端,器, 能夠使用GoCenter中的包正確構建Go應用,而無需手動設定。

要安裝goc,需要使用以下的curl命令,或按照goc的github主頁( )的說明:

$ curl -fL | sh

然後, 就可以從Go專案的根目錄中執行任何命令, 就像執行Go命令一樣。例如:

$ goc build

goc工具自動分配GOPROXY連線GoCenter,所以能夠優先從該倉庫解析Go的依賴包。對於在GoCenter找不到的包,goc將會試圖透過原始碼控制系統來解析它們,以更好地保證成功構建Go專案。

Go客戶端自身不能執行這種輔助操作(請參閱下文), 因此至少在 GoCenter能夠為大多數Go開發人員提供可能需要的所有依賴之前,仍然建議使用goc。


2 、使用Go客戶端

推薦在構建中使用GoCenter的方式是透過goc工具。goc工具包裝了Go的客戶端,器, 能夠使用GoCenter中的包正確構建Go應用,而無需手動設定。

如上所述,使用GoCenter時並不建議直接利用Go客戶端進行構建,因為當在GoCenter找不到相關依賴包時構建會失敗。對於Go客戶端這種限制的詳細資訊,可以參考相關的issue和修正資訊()。Go開發人員還是應該改用goc。

當然,如果在充分了解這個限制還希望使用的情況下,也是可以使用Go客戶端的。

如果希望構建Go專案時從GoCenter中獲取相關依賴包,需要設定GOPROXY指向GoCenter的URL, :

$ export GOPROXY=

現在就可以使用Go客戶端構建Go應用了:

$ go build


3 、部署代理GoCenter的私有倉庫

如果使用的是如Artifactory這樣的私有倉庫,則只需設定GOPROXY指向該私有倉庫,而把GoCenter建立為該私有倉庫當中的遠端倉庫。

為了要在Artifactory裡建立代理GoCenter的遠端倉庫,需要遵循以下步驟:

1. 建立新的遠端倉庫,並設定包型別為Go;

2. 設定遠端倉庫的名字,並在URL欄位輸入 ;

3. 點選“儲存 & 完成”按鍵。

還可以建立虛擬倉庫,用以聚合同時從本地Go倉庫和遠端倉庫獲取的Go依賴包。

一旦在Artifactory裡配置好使用GoCenter,就可以使用標準的GOPROXY方式基於Artifactory進行構建。需要注意的是,根據Artifacotry上的設定,需要適當地處理客戶端的認證資訊,應為當前Go客戶端在獲取模組時是不會傳送相關認證資訊的,所以處理起來是有一定難度的。因此,當使用Artifactory代理GoCenter時,建議使用JFrog CLI來構建Go應用。當配置好JFrog CLI和Artifactory的關聯之後,就可以使用類似於

“jfrog rt go build” 的命令來從Artifactory獲取依賴,並構建Go應用。

使用JFrog CLI的好處是可以方便地向Artifactory上傳針對特定構建而建立的依賴包,也同時內建支援生成和釋出與構建過程相關的後設資料。詳細資訊,請參考JFrog CLI的相關文件。

五、搜尋 Go 模組

GoCenter首頁中的搜尋框可幫助按特定模組名稱(例如, "虹膜")進行搜尋。當執行搜尋時,GoCenter將列出與搜尋名稱匹配或部分匹配的模組。


點選列表中的某個模組,將會列出GoCenter中該模組的所有版本:



列出的版本都利用顏色編碼來指示其當前的可用狀態:

綠色 ,表示該模組版本已在GoCenter之中且處於可用狀態;

紅色 ,表示該模組版本不存在,而且不可用;

灰色 ,表示該模組版本正在引入的過程中,尚未可用。

搜尋結果還會顯示那些Go專案在相關Git程式碼庫存在,而在GoCenter尚不存在的模組版本列表。如果有這樣的缺失版本,可以透過單擊“Add missing version(s)”把它們 新增到GoCenter。


六、提交自己的 Go 模組

如果希望將自己的Go專案新增到GoCenter,使其可被Go社群的開發人員使用,則需要提交相關的加入申請。

首先可以對希望加入的模組名執行搜尋。如果相關模組並不存在,則可以單擊“Add”圖示來請求新增模組。一旦點選,將會看到加入申請表格。在表格中,可以輸入申請加入的Go模組的URL。透過搜尋該模組的結果可以檢視該模組的加入進度。

GoCenter將依據以下最低標準來驗證加入請求:

·        Go模組位於gihub.com或gopkg.in上的公共專案(repo);

·        該專案沒有被設定為存檔狀態(archived);

·        該專案至少擁有3顆星


七、總結

自從2007年首次在谷歌構想,並於2009年正式推出,Go語言很快就成為 。事實上,Helm和Kubernetes都是用Go語言編寫的。在2017年的一項調查中,Go語言在開發者的偏好中排名最高,67%的開發者都在利用Go語言程式設計。

為此, 我們期望GoCenter能夠為不斷增長的Go社群和開發人員提供必要的服務,並幫助Go語言更加符合DevOps的需求。

透過訪問GoCenter, ,可以發現經常使用的Go依賴包都已經包含在其中了。如果還沒有,請提交相關的加入申請。

GoCenter管理了版本化的Go模組,可以和Go應用構建使用的任何CI伺服器或私有倉庫進行對接。而使用JFrog CLI和Artifactory,可以使得這一過程更加便捷。

想要了解有關 GoCenter 更多深入的技術資訊?請檢視GoCenter的Github專案, 。


八、參考文獻

Golang

Go & Versioning:

GoCenter

         

goc

JFrog CLI:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2672508/,如需轉載,請註明出處,否則將追究法律責任。

相關文章