如有任何問題或建議,歡迎及時交流和碰撞。個人公衆號是 【腦子進煎魚了】,GitHub 地址: https://github.com/eddycjy。
你們好,我是煎魚。git
前幾天 Go 官方正式發佈了 1.16 版本。從這個版本起,環境變量 GO111MODULE 的默認值正式修改成 on。github
這也意味着 Go modules 將更進一步推動其業務覆蓋面,有新老項目共存的小夥伴建議手動將 GO111MODULE 調整爲 auto。架構
Go1.16 針對 Go modules 放出了一個新特性,可以讓維護 Go mod 庫的開發者擁有反覆吃 「後悔藥」 的權力,提醒開發者已發佈的 「髒」 版本存在問題。微服務
這個新特性,對於許多維護和使用公共庫(開源、企業等)的小夥伴簡直是一個小福音,建議你們都應該要了解這個知識點。工具
在接下來文章中將進行詳細說明和介紹。開發工具
Go1.16 起能夠在 go.mod 文件中使用 retract
指令來聲明該第三方模塊的某些發行版本不能被其餘模塊使用。ui
在使用場景上:在發現嚴重問題或無心發佈某些版本後,模塊的維護做者能夠撤回該版本,支持撤回單個或多個版本。編碼
之前沒有辦法解決,所以一旦出現就很是麻煩。對應二者的操做以下:spa
維護者:設計
使用者:
所以在本次 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
但隨着時間不斷推移,第三方開源庫 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 )
成功發佈最新版本 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 軟撤回版本的一個方法,可以把問題更直觀的反饋到開發者的手中,再結合平常開發工具的話更是美哉。
但這個特性的徹底應用目前也是有必定的阻礙的:
你對 Go modules 的 retract 特性怎麼看,歡迎一塊兒留言討論!
分享 Go 語言、微服務架構和奇怪的系統設計,歡迎你們關注個人公衆號和我進行交流和溝通。
最好的關係是互相成就,各位的點贊就是煎魚創做的最大動力,感謝支持。