GoCenter助力Golang全速前進
一、背景
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Golang之go module開發系列二--使用偽版本和GoCenterGolang
- 百度宣佈組建智慧汽車公司:推動無人駕駛汽車全速前進
- golang import包前的字母與符號GolangImport符號
- 深入淺出 Golang 資源嵌入方案:前篇Golang
- golang寫入檔案時,覆蓋前檔案(將前檔案清空)Golang
- golang 進度條功能實現Golang
- 自信才能邁出前進
- 走進Golang之編譯器原理Golang編譯
- 全速正都光由方料出業位山cif
- 用 golang 原生 sql 對 MySQL 進行 curdGolangMySql
- golang使用JWX進行認證和加密Golang加密
- vue路由前進後退動畫Vue路由動畫
- 如何應用Kaizen改進當前流程?AI
- WePack —— 助力企業漸進式 DevOps 轉型dev
- Golang 專案中如何對 API 進行測試?GolangAPI
- 手把手帶你進行Golang環境配置Golang
- Golang Http 庫指定 dns 伺服器進行解析GolangHTTPDNS伺服器
- 製造商朝DOE LED功效目標邁進穩步前進
- GoCenter 的“火眼金睛” ——檢測、報告並減少Go Module的安全漏洞Go
- 疫情當前,中安威士助力支撐聯防聯控工作
- 基於 golang 開發的短鏈服務(自帶前臺頁面)Golang
- 全速數字化:構建財富管理新護城河(附下載)
- Steam獨自推動Linux遊戲前進Linux遊戲
- 漸進學習前饋神經網路神經網路
- 一起教育的前進與焦慮
- 深圳前8月進出口同比增長2%
- 做足前戲,讓你平滑進入 VueVue
- 「視覺化助力」,醫療進步無限可能視覺化
- HR系統助力企業實現管理進階
- golang: 給二進位制檔案增加版本資訊Golang
- 5G時代來襲,遊戲界步入全速前行快車道遊戲
- vue-route-transition路由前進後退動畫Vue路由動畫
- PouchContainer 容器技術演進助力阿里雲原生升級AI阿里
- 如何優雅的在Golang中進行錯誤處理Golang
- php 實現golang defer延遲執行(先進後出)PHPGolang
- 千鋒Go語言影片教程之Golang進階實戰程式設計(進階必看)Golang程式設計
- 蘋果新一代MacBook隱藏特性:四個雷電介面都是全速蘋果Mac
- waffle.model改進前、後的程式碼對比