【Golang】发布Go package和import第三方包
构建package
-
首先,我们在github上创建一个公有仓库并clone到本地
git clone git@github.com:doubleZ0108/my-go-package-test.git cd my-go-package-test
-
在
my-go-package-test
工程中初始化go.mod
,其中后面的链接要跟github上创建的仓库和你的用户名对应go mod init github.com/doubleZ0108/my-go-package-test
-
创建
myfunc/
文件夹用于构建自己的一个package -
按照测试驱动开发(TDD)的思想,首先编写测试脚本
myfunc_test.go
TestMyfunc(t *testing.T)
:用于编写测试ExampleMyfunc()
:用于编写示例(后续可以在文档中显示),其中需要在最后一行通过注释的方式详细写出期望的输出,如果不写这行,之后运行go test
时只会编译该示例函数但并不会执行
-
然后编写真正的逻辑代码
myfunc.go
,并将方法封装成Myfunc()
函数方便之后引用调用 -
在myfunc/文件夹下运行测试,添加-v选项可以详细查看运行流程
$ go test -v === RUN TestMyfunc --- PASS: TestMyfunc (0.00s) === RUN ExampleMyfunc --- PASS: ExampleMyfunc (0.00s) PASS ok github.com/doubleZ0108/my-go-package-test/myfunc 2.340s
-
myfunc.go
代码package myfunc func Myfunc(x, y int) int { return x + y }
-
myfunc_test.go
代码package myfunc import ( "fmt" "testing" ) func TestMyfunc(t *testing.T) { sum := Myfunc(1, 2) expected := 3 if sum != expected { t.Errorf("expected '%d' but got '%d'", expected, sum) } } func ExampleMyfunc() { sum := Myfunc(3, 4) fmt.Println(sum) // Output: 7 }
发布package
如上已经完成了一个package的构建,接下来:
-
首先将代码push到远程仓库中
git add * git commit -m "add myfunc go package" git push origin master
-
给我们的package打上一个tag然后发布,通常以
vx.x.x
格式命名
-
发布之后在Releases选项卡中可以看到我们发布的package
-
但是现在如果在pkg.go.dev上搜索我们的包
github.com/doubleZ0108/my-go-package-test
还搜不到,这是因为只有通过proxy.golang.org下载包的时候,才会自动同步到pkg.go.dev上 -
所以我们先看看如何在另一个工程中引用我们刚刚发布在github上的“第三方”包
import package
-
首先我们新创建一个工程,比如叫
go-main/
,在这个主工程里要使用我们刚刚写好的“第三方”包 -
同样的,还是先要在
go-main/
中通过go mod init
初始化go mod init github.com/doubleZ0108/main
-
然后通过go get即可下载第三方库
$ go get -u github.com/doubleZ0108/my-go-package-test go: added github.com/doubleZ0108/my-go-package-test v0.1.0
在自动创建的
go.sum
文件中我们可以看到如下内容github.com/doubleZ0108/my-go-package-test v0.1.0 h1:HCLq71vGtip5O7E1hjoA1TRTPWqk7whD5WQVwQC26UY= github.com/doubleZ0108/my-go-package-test v0.1.0/go.mod h1:XXuJIJyJcvLndbLgBAp2WOc4kwtd6TyNAdHQRy+fvnU=
-
然后我们编写一个
main.go
测试一下 -
运行
go run main.go
,大功告成🎉
-
main.go
代码package main import ( "fmt" "github.com/doubleZ0108/my-go-package-test/myfunc" ) func main() { sum := myfunc.Myfunc(99, 1) fmt.Println(sum) }
pkg.go.dev
最后,让我们在pkg.go.dev上搜索我们的包github.com/doubleZ0108/my-go-package-test
会发现已经有了我们的package myfunc,但是点开之后什么都没显示
这是由于pkg.go.dev的license policy导致的
-
我们回到github仓库,Add files → Create new file → 输入LICENSE右侧会自动出现选择模板的按钮 → 选择一个模板,例如MIT License,然后提交这个文件
-
重新打包一个Releases,这里不妨命名为v0.1.1(注意如果还选择v0.1.0,代码并不会修改,因为会直接使用当时打tag的代码)
-
我们重新在go-main中拉取一下,注意最好指定一下版本(或最新版),否则会默认用之前cache的v0.1.0版本
go get -u github.com/doubleZ0108/my-go-package-test@v0.1.1
最后稍等一会就可以在pkg.go.dev上搜到我们的包github.com/doubleZ0108/my-go-package-test
啦!
可以看到我们之前的Example也被很好的记录到Document里了🎉