前言:
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 ?
顧名思義就是版本的撤回,也就是將「有問題」的版本將以撤回。
為何需要 Retraction ?
通常有兩類的問題:
- 「已經發佈」的版本中,有某個版本發現致命的錯誤需要撤回。
- 其中「已經發佈」代表已經公開發佈在 github (或其他 repository) ,並且有人使用。
- 不小心將版本號碼打錯了,比如說 0.4.0 的版本,後來不小心打成 1.0.0 但是又被人拿去使用。
以前要如合作撤回版本的方式
由於以往並沒有提供 Go Module Retraction ,所以發生以上情形,只能在 README 上面註解。 並沒有方式在 go get
同時獲得足夠的資訊。
如何使用 Go modules Retraction
這裡透過線上 Go Dev Playground,直接一步步講解主要的問題解決方式。 詳細的程式碼,可以到裡面去查看。
問題 1: 發現有某個版本出現了重大問題怎麼辦?
假設你管理套件 gopher.live/ue0ddd4a99c02/proverb
,目前已經發佈到了 0.2.0
的版本出去。但是發現你這個版本有重大的問題。需要把這個版本撤回(或是下架),那麼你可以在套件的 repo 中輸入以下的指令:
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/[email protected]
go: warning: gopher.live/ue0ddd4a99c02/[email protected]: retracted by module author: Go proverb was totally wrong
go: to switch to the latest unretracted version, run:
go get gopher.live/ue0ddd4a99c02/proverb@latestgo get: downgraded gopher.live/ue0ddd4a99c02/proverb v0.3.0 => v0.2.0
這樣的方式,就可以透過這個方式來達到撤回版本的流程。
相關疑問:
- 如果沒有執行
go get
來連接查詢,是不是沒有辦法取得版本撤回的資訊?- 沒有錯,目前依舊需要透過
go get
或是go list
來取得資料。
- 沒有錯,目前依舊需要透過