怎麼把自己造的輪子發佈到 Go Module 上
我們在開發 Go 項目時,經常會使用到一些外部依賴包。它們一般都是通過形如go get example.com/xxx
的命令形式獲取到本地使用。
本着開源精神,如果我們想將自己開發的包共享出去,讓其他人也能使用go get
命令獲取到它們,應該如何做呢?
本文將以開源至 Github 平臺爲例,展示其流程。
建立倉庫
首先,在 github 平臺建立倉庫,設置想要開源的 Go 庫名。這裏將項目名取爲 publishdemo,狀態爲 Public。
開發模塊代碼
將創建好的倉庫,通過 git clone 命令拉取至本地開發。
$ git clone git@github.com:golangShare/publishdemo.git
此時,在項目根目錄publishdemo/
下,僅包含了 LICENSE 和 README 文件,不包含任何 Go 代碼。
$ ls
LICENSE README.md
爲項目初始化 mod 文件
$ go mod init github.com/golangShare/publishdemo
假設,我們想開源的 Go 工具類的庫,此時準備先提供的是對字符串相關的操作。因此在publishdemo/
目錄下,我們新增stringutil/
子目錄,在子目錄中增加 reverse.go 文件,其內容如下。
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)
}
很簡單,我們想提供的是一個翻轉字符串功能函數。
當然,我們也應該提供測試代碼。在同級目錄增加 reverse_test.go 文件,其內容如下。
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
開發完成,我們就可以將工具庫共享出去了。
發佈
爲了避免模塊中還記錄了不再需要的依賴項,執行 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
使用
發佈之後,其他項目就可以通過以下命令獲取我們開源的 Go 包了。
$ go get github.com/golangShare/publishdemo@v0.1.0
此時項目 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)
}
總結
看完了上述流程,可以發現:開源自己的 Go 庫,其實非常簡單。
但還是有些地方需要注意一下:
-
不要在開源的 mod 文件中記錄不需要的依賴。
-
即使發現 bug,也不要更改已發佈版本的代碼,而應該發佈新版本。
-
遵循版本命名規範,推薦參考 Module version numbering 一文:https://go.dev/doc/modules/version-numbers 一文
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/vRWo1ZrsXlBXOrabjYtBSw