前言:

Go Module 在 1.11 的版本正式導入了 Golang Modules 讓許多套件可以使用 Go Module 來管理相依 (Dependency) 的套件。並且在 Go 1.16 版本也預設開啟了 Go Modules 的選項。但是在開發套件 (Package) 的時候可能會發生以下的問題:

  • 忽然發現某個的套件有重大的問題,希望其他人不要使用到這個套件。
  • 不小心進版號進太多了,而且有一些人也使用到這些版本。 (e.g 本來要跑 v0.4.0 ,結果不小心寫成 v1.0.0 )

以上兩個問題,如果在套件還沒有散佈出去的話,其實都是沒有問題的。但是如果套件也散布出去的話,就需要透過套件的撤回(Retract) ,來讓使用套件的開發者能了解相關的問題,也讓之後使用的人不會再用到這個版號。

本篇文章將會介紹 Go 1.16 裡面一個比較沒有被重點宣傳的功能(大部分人注意的是 Apple M1 支援),並且透過官方給的線上範例也給版本撤回的實作。

TL;DR

本篇文將要介紹:

  • 為什麼需要 Retraction

  • 以往要如合作撤回版本的方式

  • 如何使用 Go modules Retraction

什麼是 Retraction ?

顧名思義就是版本的撤回,也就是將「有問題」的版本將以撤回。

為何需要 Retraction ?

通常有兩類的問題:

  • 「已經發佈」的版本中,有某個版本發現致命的錯誤需要撤回。
    • 其中「已經發佈」代表已經公開發佈在 github (或其他 repository) ,並且有人使用。
  • 不小心將版本號碼打錯了,比如說 0.4.0 的版本,後來不小心打成 1.0.0 但是又被人拿去使用。

以前要如合作撤回版本的方式

go get

如何使用 Go modules Retraction

這裡透過線上 Go Dev Playground ,直接一步步講解主要的問題解決方式。 詳細的程式碼,可以到 裡面去 查看。

問題 1: 發現有某個版本出現了重大問題怎麼辦?

gopher.live/ue0ddd4a99c02/proverb0.2.0
go mod edit -retract=v0.2.0
go.mod
module gopher.live/ue0ddd4a99c02/proverb

go 1.16

// Go proverb was totally wrong
retract v0.2.0
go.mod
git add -A
$ git commit -q -m "Fix severe error in Go proverb"
$ git push -q origin main
remote: . Processing 1 references        
remote: Processed 1 references in total        
$ git tag v0.3.0
$ git push -q origin v0.3.0

透過以上方式,可以將版號推進一號。也已經把正確的內容修正好了。

如果其他人想要拉下有問題的版本,就會出現相關警告。

go get gopher.live/ue0ddd4a99c02/<a href="/cdn-cgi/l/email-protection" data-cfemail="c3b3b1acb5a6b1a183b5f3edf1edf3">[email protected]</a>
go: warning: gopher.live/ue0ddd4a99c02/<a href="/cdn-cgi/l/email-protection" data-cfemail="2252504d544750406254120c100c12">[email protected]</a>: retracted by module author: Go proverb was totally wrong
go: to switch to the latest unretracted version, run:
	go get gopher.live/ue0ddd4a99c02/<a href="/cdn-cgi/l/email-protection" data-cfemail="0777756871627565476b66736274736068">[email protected]</a> get: downgraded gopher.live/ue0ddd4a99c02/proverb v0.3.0 => v0.2.0

這樣的方式,就可以透過這個方式來達到撤回版本的流程。

相關疑問:

go getgo getgo list

相關學習資源