Go1.16 新特性:Go mod 的後悔藥,僅需這一招

如有任何問題或建議,歡迎及時交流和碰撞。個人公衆號是 【腦子進煎魚了】,GitHub 地址: https://github.com/eddycjy

你們好,我是煎魚。git

前幾天 Go 官方正式發佈了 1.16 版本。從這個版本起,環境變量 GO111MODULE 的默認值正式修改成 ongithub

image.png

這也意味着 Go modules 將更進一步推動其業務覆蓋面,有新老項目共存的小夥伴建議手動將 GO111MODULE 調整爲 auto。架構

Go1.16 針對 Go modules 放出了一個新特性,可以讓維護 Go mod 庫的開發者擁有反覆吃 「後悔藥」 的權力,提醒開發者已發佈的 「髒」 版本存在問題微服務

這個新特性,對於許多維護和使用公共庫(開源、企業等)的小夥伴簡直是一個小福音,建議你們都應該要了解這個知識點。工具

在接下來文章中將進行詳細說明和介紹。開發工具

後悔藥:Go mod retract

Go1.16 起能夠在 go.mod 文件中使用 retract 指令來聲明該第三方模塊的某些發行版本不能被其餘模塊使用。ui

在使用場景上:在發現嚴重問題或無心發佈某些版本後,模塊的維護做者能夠撤回該版本,支持撤回單個或多個版本。編碼

之前沒有辦法解決,所以一旦出現就很是麻煩。對應二者的操做以下:spa

  • 維護者:設計

    • 刪除有問題版本的 tag。
    • 從新打一個新版本的 tag。
  • 使用者:

    • 發現有問題的版本 tag 丟失,需手動介入。
    • 不知道有問題,因爲其餘庫依賴,所以被動升級而踩坑。

所以在本次 Go1.16 發佈後,就擁有了一個半止損的新手段了,也能夠做爲 Go mod 自動更新的大坑的補全辦法之一。

實戰演練

爲了方便演示,首先建立一個 Demo 項目(github.com/eddycjy/go-retract-demo),其含有一個基礎方法:

package go_retract_demo

func HelloWorld() string {
    return "001:腦子進煎魚了!"
}

另外有一個應用工程依賴了該第三方庫,代碼以下:

func main() {
  // import demo "github.com/eddycjy/go-retract-demo"
    s := demo.HelloWorld()
    fmt.Println(s)
}

對應的 go.mod 文件以下:

module github.com/eddycjy/awesomeProject

go 1.16

require github.com/eddycjy/go-retract-demo v0.0.1

retract 特性演示

但隨着時間不斷推移,第三方開源庫 eddycjy/go-retract-demo 即將迭代到 v0.3.0 時,發現以往的 v0.2.0 是有 BUG 的。

須要緊急的在v0.3.0 版本把這個 BUG 修復並提醒出去。此時能夠在 go.mod 文件中寫入 retract 指令:

module github.com/eddycjy/go-retract-demo

go 1.16

// 由於煎魚不當心敲錯了...
retract v0.2.0

指令上面爲撤回的緣由,後面是具體的版本。若是涉及多版本,能夠以下編寫:

retract (
  v0.1.0
  v0.2.0
)

retract 特性效果

成功發佈最新版本 v0.3.0 版本並指定 retract 後。
全部引用了該庫的工程應用,執行 go list 就能夠看到以下提醒:

$ go1.16 list -m -u all
github.com/eddycjy/awesomeProject
github.com/eddycjy/go-retract-demo v0.2.0 (retracted) [v0.3.0]

結合該命令,咱們平常使用的 IDE(例如:GoLand),其在保存時是會默認執行 go list 命令的。在後續 IDE 支持後,就能夠在編碼時就快速發現有問題的版本和提示

在手動執行 go get 時也會出現 warning 提示,會把 go.mod 文件上的緣由註釋顯示出來:

$ go1.16 get github.com/eddycjy/go-retract-demo@v0.2.0
go: warning: github.com/eddycjy/go-retract-demo@v0.2.0: retracted by module author: 由於煎魚不當心敲錯了...
go: to switch to the latest unretracted version, run:
    go get github.com/eddycjy/go-retract-demo@latest

這樣就能看到是哪一個模塊依賴,由於什麼緣由要求撤回了,很是直觀。

總結

以往在出問題後每一個個體須要跑去問維護者或者看 GitHub Commits,那樣總歸很是麻煩,極可能一來一回半個鍾就沒了。

新特性給予了 Go modules 軟撤回版本的一個方法,可以把問題更直觀的反饋到開發者的手中,再結合平常開發工具的話更是美哉。

但這個特性的徹底應用目前也是有必定的阻礙的:

  • 國內模塊代理:須要國內的模塊代理也支持 retract ,不然即便你更新了版本也沒有提示處理
  • IDE:IDE 針對 retract 作一些支持,例如:文字顏色標紅、黃等,可以便於開發者更好的識別。

你對 Go modules 的 retract 特性怎麼看,歡迎一塊兒留言討論!

個人公衆號

分享 Go 語言、微服務架構和奇怪的系統設計,歡迎你們關注個人公衆號和我進行交流和溝通。

最好的關係是互相成就,各位的點贊就是煎魚創做的最大動力,感謝支持。

相關文章
相關標籤/搜索