如何開源自己的 Go 庫

我們在開發 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 庫,其實非常簡單。

但還是有些地方需要注意一下:

機器鈴砍菜刀

歡迎添加小菜刀微信

加入 Golang 分享羣學習交流!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/VwLuqKXxaafhsw57aSY8TA