如何開源自己的 Go 庫
回復“Go語言”即可獲贈從入門到進階共10本電子書
他鄉(xiāng)生白發(fā),舊國見青山。
我們在開發(fā) Go 項目時,經(jīng)常會使用到一些外部依賴包。它們一般都是通過形如go get example.com/xxx的命令形式獲取到本地使用。
本著開源精神,如果我們想將自己開發(fā)的包共享出去,讓其他人也能使用go get命令獲取到它們,應該如何做呢?
本文將以開源至 Github 平臺為例,展示其流程。
建立倉庫
首先,在 github 平臺建立倉庫,設置想要開源的 Go 庫名。這里將項目名取為 publishdemo,狀態(tài)為 Public。

開發(fā)模塊代碼
將創(chuàng)建好的倉庫,通過 git clone 命令拉取至本地開發(fā)。
$?git?clone[email protected]:golangShare/publishdemo.git
此時,在項目根目錄publishdemo/下,僅包含了 LICENSE 和 README 文件,不包含任何 Go 代碼。
$?ls
LICENSE???README.md
為項目初始化 mod 文件
$?go?mod?init?github.com/golangShare/publishdemo
假設,我們想開源的 Go 工具類的庫,此時準備先提供的是對字符串相關的操作。因此在publishdemo/目錄下,我們新增stringutil/子目錄,在子目錄中增加 reverse.go 文件,其內(nèi)容如下。
package?stringutil
//?Reverse?returns?its?argument?string?reversed?rune-wise?left?to?right.
func?Reverse(s?string)?string?{
?r?:=?[]rune(s)
?for?i,?j?:=?0,?len(r)-1;?i?len(r)/2;?i,?j?=?i+1,?j-1?{
??r[i],?r[j]?=?r[j],?r[i]
?}
?return?string(r)
}
很簡單,我們想提供的是一個翻轉(zhuǎn)字符串功能函數(shù)。
當然,我們也應該提供測試代碼。在同級目錄增加 reverse_test.go 文件,其內(nèi)容如下。
package?stringutil
import?"testing"
func?TestReverse(t?*testing.T)?{
?for?_,?c?:=?range?[]struct?{
??in,?want?string
?}{
??{"Hello,?world",?"dlrow?,olleH"},
??{"Hello,?世界",?"界世?,olleH"},
??{"",?""},
?}?{
??got?:=?Reverse(c.in)
??if?got?!=?c.want?{
???t.Errorf("Reverse(%q)?==?%q,?want?%q",?c.in,?got,?c.want)
??}
?}
}
回到項目根目錄,此時,代碼結構如下
.
├──?LICENSE
├──?README.md
├──?go.mod
└──?stringutil
????├──?reverse.go
????└──?reverse_test.go
1?directory,?5?files
測試代碼也都通過
$?go?test?./...
ok???github.com/golangShare/publishdemo/stringutil?0.005s
開發(fā)完成,我們就可以將工具庫共享出去了。
發(fā)布
為了避免模塊中還記錄了不再需要的依賴項,執(zhí)行 go mod tidy 移除它們。
$?go?mod?tidy
使用 git tag 命令標記版本信息
$?git?commit?-m?"add?Reverse:?for?v0.1.0"
$?git?tag?v0.1.0
將其 push 至遠程倉庫
$?git?push?origin?v0.1.0
使用
發(fā)布之后,其他項目就可以通過以下命令獲取我們開源的 Go 包了。
$?go?get?github.com/golangShare/[email protected]
此時項目 go.mod 文件中,將會增加以下一行記錄
require?github.com/golangShare/publishdemo?v0.1.0
和其他三方庫一樣的方式使用即可
package?main
import?(
?"fmt"
?"github.com/golangShare/publishdemo/stringutil"
)
func?main()?{
?s?:=?stringutil.Reverse("hello?gopher")
?fmt.Println(s)
}
總結
看完了上述流程,可以發(fā)現(xiàn):開源自己的 Go 庫,其實非常簡單。
但還是有些地方需要注意一下:
不要在開源的 mod 文件中記錄不需要的依賴。 即使發(fā)現(xiàn) bug,也不要更改已發(fā)布版本的代碼,而應該發(fā)布新版本。 遵循版本命名規(guī)范,推薦參考 Module version numbering 一文:https://go.dev/doc/modules/version-numbers 一文

-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Go學習群請在后臺回復【入群】
萬水千山總是情,點個【在看】行不行
