• 【Golang】发布Go package和import第三方包


    【Golang】发布Go package和import第三方包

    构建package

    1. 首先,我们在github上创建一个公有仓库并clone到本地

      git clone git@github.com:doubleZ0108/my-go-package-test.git
      cd my-go-package-test
      
      • 1
      • 2
    2. my-go-package-test工程中初始化go.mod,其中后面的链接要跟github上创建的仓库和你的用户名对应

      go mod init github.com/doubleZ0108/my-go-package-test
      
      • 1
    3. 创建myfunc/文件夹用于构建自己的一个package

    4. 按照测试驱动开发(TDD)的思想,首先编写测试脚本myfunc_test.go

      • TestMyfunc(t *testing.T):用于编写测试
      • ExampleMyfunc():用于编写示例(后续可以在文档中显示),其中需要在最后一行通过注释的方式详细写出期望的输出,如果不写这行,之后运行go test时只会编译该示例函数但并不会执行
    5. 然后编写真正的逻辑代码myfunc.go,并将方法封装成Myfunc()函数方便之后引用调用

    6. 在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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • myfunc.go 代码

      package myfunc
      
      func Myfunc(x, y int) int {
      	return x + y
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 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
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

    发布package

    如上已经完成了一个package的构建,接下来:

    1. 首先将代码push到远程仓库中

      git add *
      git commit -m "add myfunc go package"
      git push origin master
      
      • 1
      • 2
      • 3
    2. 给我们的package打上一个tag然后发布,通常以vx.x.x格式命名

      在这里插入图片描述
      在这里插入图片描述

    3. 发布之后在Releases选项卡中可以看到我们发布的package
      在这里插入图片描述

    4. 但是现在如果在pkg.go.dev上搜索我们的包github.com/doubleZ0108/my-go-package-test 还搜不到,这是因为只有通过proxy.golang.org下载包的时候,才会自动同步到pkg.go.dev上

    5. 所以我们先看看如何在另一个工程中引用我们刚刚发布在github上的“第三方”包

    import package

    1. 首先我们新创建一个工程,比如叫go-main/,在这个主工程里要使用我们刚刚写好的“第三方”包

    2. 同样的,还是先要在go-main/中通过go mod init初始化

      go mod init github.com/doubleZ0108/main
      
      • 1
    3. 然后通过go get即可下载第三方库

      $ go get -u github.com/doubleZ0108/my-go-package-test
      go: added github.com/doubleZ0108/my-go-package-test v0.1.0
      
      • 1
      • 2

      在自动创建的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=
      
      • 1
      • 2
    4. 然后我们编写一个main.go测试一下

    5. 运行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)
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

    pkg.go.dev

    最后,让我们在pkg.go.dev上搜索我们的包github.com/doubleZ0108/my-go-package-test
    在这里插入图片描述

    会发现已经有了我们的package myfunc,但是点开之后什么都没显示

    这是由于pkg.go.dev的license policy导致的

    1. 我们回到github仓库,Add files → Create new file → 输入LICENSE右侧会自动出现选择模板的按钮 → 选择一个模板,例如MIT License,然后提交这个文件
      在这里插入图片描述
      在这里插入图片描述

      在这里插入图片描述

    2. 重新打包一个Releases,这里不妨命名为v0.1.1(注意如果还选择v0.1.0,代码并不会修改,因为会直接使用当时打tag的代码)

    3. 我们重新在go-main中拉取一下,注意最好指定一下版本(或最新版),否则会默认用之前cache的v0.1.0版本

      go get -u github.com/doubleZ0108/my-go-package-test@v0.1.1
      
      • 1

    最后稍等一会就可以在pkg.go.dev上搜到我们的包github.com/doubleZ0108/my-go-package-test 啦!

    可以看到我们之前的Example也被很好的记录到Document里了🎉

    在这里插入图片描述

  • 相关阅读:
    什么是运营商精准大数据?又有什么作用?
    关于 Linux Shell文件的三个时间
    ++ Reference: Standard C++ Library reference: C Library: cmath: lround
    Python - 一个恶意脚本
    若依框架的使用
    基于云原生技术的融合通信是如何实现的?
    【教资科一传统文化】文化素养传统文化之神话传说、天文历法、古代称谓、中国传统节日、成语典故
    C#连接到SQL Server数据库
    嵌入式分享合集17
    网络编程套接字,Linux下实现echo服务器和客户端
  • 原文地址:https://blog.csdn.net/double_ZZZ/article/details/126481687