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

開發(fā)模塊代碼
將創(chuàng)建好的倉(cāng)庫,通過 git clone 命令拉取至本地開發(fā)。
$?git?clone[email protected]:golangShare/publishdemo.git
此時(shí),在項(xiàng)目根目錄publishdemo/下,僅包含了 LICENSE 和 README 文件,不包含任何 Go 代碼。
$?ls
LICENSE???README.md
為項(xiàng)目初始化 mod 文件
$?go?mod?init?github.com/golangShare/publishdemo
假設(shè),我們想開源的 Go 工具類的庫,此時(shí)準(zhǔn)備先提供的是對(duì)字符串相關(guān)的操作。因此在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)
}
很簡(jiǎn)單,我們想提供的是一個(gè)翻轉(zhuǎn)字符串功能函數(shù)。
當(dāng)然,我們也應(yīng)該提供測(cè)試代碼。在同級(jí)目錄增加 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)
??}
?}
}
回到項(xiàng)目根目錄,此時(shí),代碼結(jié)構(gòu)如下
.
├──?LICENSE
├──?README.md
├──?go.mod
└──?stringutil
????├──?reverse.go
????└──?reverse_test.go
1?directory,?5?files
測(cè)試代碼也都通過
$?go?test?./...
ok???github.com/golangShare/publishdemo/stringutil?0.005s
開發(fā)完成,我們就可以將工具庫共享出去了。
發(fā)布
為了避免模塊中還記錄了不再需要的依賴項(xiàng),執(zhí)行 go mod tidy 移除它們。
$?go?mod?tidy
使用 git tag 命令標(biāo)記版本信息
$?git?commit?-m?"add?Reverse:?for?v0.1.0"
$?git?tag?v0.1.0
將其 push 至遠(yuǎn)程倉(cāng)庫
$?git?push?origin?v0.1.0
使用
發(fā)布之后,其他項(xiàng)目就可以通過以下命令獲取我們開源的 Go 包了。
$?go?get?github.com/golangShare/[email protected]
此時(shí)項(xiàng)目 go.mod 文件中,將會(huì)增加以下一行記錄
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)
}
總結(jié)
看完了上述流程,可以發(fā)現(xiàn):開源自己的 Go 庫,其實(shí)非常簡(jiǎn)單。
但還是有些地方需要注意一下:
不要在開源的 mod 文件中記錄不需要的依賴。 即使發(fā)現(xiàn) bug,也不要更改已發(fā)布版本的代碼,而應(yīng)該發(fā)布新版本。 遵循版本命名規(guī)范,推薦參考 Module version numbering 一文:https://go.dev/doc/modules/version-numbers 一文

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

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Go學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬水千山總是情,點(diǎn)個(gè)【在看】行不行
