10分鐘將你的Go工程轉換為Go Module模式

2021-09-27 05:01:45 字數 2322 閱讀 9417

引言

自從在go 1.11和更高版本中引入了go的新的依賴管理系統以來,golang開發人員已經接受了包版本控制解決方案。這樣做的使用者可以使用gocenter儲存庫中的不可變公共go 模組,並通過更健壯、更可靠的go pipeline獲得更快的構建速度。

但是,將現有的專案轉換為使用go module並不總是很容易,尤其是如果該專案已經嘗試過golang的其他包管理解決方案時。

為了幫助golang社群正確地使用go module,我們將使用開源的etcd專案(kubernetes使用的鍵值資料儲存)作為示例。這是乙個最佳實踐的實際示例,因為它足夠複雜,可以展示一些常見的實踐

應用go module方式後可以獲得以下收益:

1.可用性(標籤tag可以從vcs中刪除)

2.不變性(可以在vcs中進行更改)

3.快速:(沒有git轉殖,沒有計算元資料,呼叫更少,效能好)

4.本地統一儲存快取($gopath/pkg /mod/cache)

go模組轉換最佳實踐

我們以etcd專案為例進行轉換,這個轉換過程已通過測試用例的驗證,可以到該專案中的pull request中檢視

步驟一:準備go.mod檔案

對於以前從未使用過模組的專案(沒有go.mod 檔案),或者任何現在不推薦的依賴項管理解決方案,這個過程都非常簡單。您只需要在專案的根目錄中執行go mod tidy。這將生成乙個新的、已填充好該專案依賴描述的go.mod檔案。

但是,如果專案使用了那些較老的解決方案之一,比如dep、glide、govendor或godep,那麼您將需要執行go mod init來生成填充的go.mod檔案。該命令支援舊格式中依賴項描述。

etcd專案確實有乙個go.mod檔案,儘管它從未在專案的構建系統中啟用。問題是模組名稱沒有正確的版本識別符號,因為當前版本標記是v2+。由於語義化匯入版本控制的影響,需要更改為v3。

其包括執行以下過程:

1.更新etcd的go.mod檔案以修正模組名稱,使其包含v3字尾。

2.更新所有**中的import以包含版本號。我們編寫了乙個指令碼,以便更容易地修改所有引用。完成後,此更改如下:

步驟二 : 啟用go模組

要使go客戶端能夠使用go module,需要設定go111module=on

正如我們所指出的,etcd專案已經設定了go.mod檔案,有人可能認為這已經完成了。但它沒有,而該環境變數這種缺失證實了該專案還沒有使用go module。

注意:從go 1.13開始,這一步將不再需要,因為go module將在預設情況下啟用

步驟三 : 更新測試中的匯入

在上面的過程中,我們對組成etcd主模組的go.mod檔案進行了更新,以使用v3版本標記。現在主模組被標記為v3,我們還需要更新etcd專案的測試用例中的import引用v3,以確保它們匯入了主模組的正確版本。

步驟四 : 其他更新

在這些更改之後,您可能希望保持良好的狀態—畢竟,應用程式模組現在已經全部轉換為使用go module,並使用正確的版本標記。

不過沒那麼快。一旦你開始執行測試,你會發現兩個額外的場景需要處理:

1.etcd使用了諸如golint、go******、staticcheck、ineffassign等靜態分析工具,但其中一些工具沒有模組意識,無法識別模組路徑,而無法通過必要的檢查。在etcd的這種場景下,etcd-io/etcd下並沒有v3資料夾,但是import匯入(或模組路徑)包含v3,如etcd-io/etcd/v3。其他工具是模組感知的,但必須在新版本的go 1.12中可用。如果構建系統在1.11之上,那麼它們也需要遷移到1.12。

2.如果使用了protobuf之類的**生成器。更新.proto檔案,以便使用正確版本的匯入生成**。

步驟五 : 加入gocenter

在構建過程中,您可能會注意到許多go get命令在etcd的不同階段執行。

為了加快golang應用程式的構建時間,並確保etcd ppipeline中使用的go module版本的不可變性和可用性,使用gocenter來構建etcd

只需設定goproxy=詳細原理可看上文的go proxy 原理圖)

總結正如您所看到的,將go專案轉換為使用go module方式非常簡單,但是有一些細節可能會減慢您的速度。通過選擇這個具有豐富場景的專案來演示這個過程,我們相信我們達到了大多數需要處理的場景,為您提供了乙個很好的示例,覆蓋了您可能面臨的情況。

最後大家感興趣可以測試一下舊的依賴管理方式和go module方式的效能對比,請參考:

10分鐘將你的Go工程轉換為Go Module模式

自從在go 1.11和更高版本中引入了go的新的依賴管理系統以來,golang開發人員已經接受了包版本控制解決方案。這樣做的使用者可以使用gocenter儲存庫中的不可變 公共go 模組,並通過更健壯 更可靠的go pipeline獲得更快的構建速度。但是,將現有的專案轉換為使用go module並...

10分鐘放鬆你的肩

經常伏案工作,經常使用鍵盤 滑鼠的人群,總是會感覺自己的肩部沉重 痠疼。特別想找個人給揉揉,其實不用,只要每工作兩個小時,用10分鐘的時間做一些簡單的動作就可以緩解不適的感覺了。放鬆運動 1 坐姿伸展胸運動 坐於椅上,雙臂盡量向身體兩側伸展並做後拉動作,使胸部得到充分伸展,五指張開,雙腿向前自然彎曲...

產生10分鐘有效的scretStr

專案中需要產生乙個scretstr,這個要求10分鐘之內只能使用同乙個scretstr,所以我們做了乙個工具類,其實就是記錄第一次的時間然後第二次的時候和第一次比較,如果大於10分鐘那麼重新產生,如果不大於那麼就是使用當前的。我們的返回也就是當前的時間作為唯一的scretstr。created by...