从 0 到 1 创建、测试并发布属于自己的 Go 开源库

作者:陈明勇

个人网站:https://chenmingyong.cn

文章持续更新,如果本文能让您有所收获,欢迎点赞收藏加关注本号。 微信阅读可搜《程序员陈明勇》。 这篇文章已被收录于 GitHub https://github.com/chenmingyong0423/blog,欢迎大家 Star 催更并持续关注。

前言

在日常开发中,我们经常使用由组织或个人开发和维护的第三方开源库,这些库大大提高了我们的开发效率,让我们能够专注于实现业务逻辑而不是重复造轮子。如果你对提高代码复用感兴趣,并希望将自己封装的高质量代码发布为一个开源库,那么这篇文章正是为你准备的。

接下来,我将详细探讨如何从 01 创建、测试并发布属于自己的 Go 开源库。本文以 go-mongox 仓库为例进行讲解。

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

程序员陈明勇.jpeg

总体步骤

0 到 1 创建、测试并发布属于自己的 Go 库,需要以下步骤:

  • 1、在 Github(或 Gitee,本文以 Github 为例) 上创建一个空仓库;
  • 2、本地初始化 Go 项目;
  • 3、本地初始化 Git 仓库;
  • 4、编写代码和测试用例;
  • 5、提交代码并推送到 Github
  • 6、发布版本;
  • 7、验证发布成功。

当然,如果我们本地已经存在一个准备好的 Go 项目仓库,我们可以直接在 Github 上面创建仓库并推送最新内容,然后从第六步开始。

创建 Github 仓库

GitHub 上创建仓库是发布你的 Go 库的第一步。

首先,访问 GitHub 仓库并点击 New 按钮。在创建页面,为你的仓库输入名称和简短描述。确保选择 Public 选项,将其设置为一个公开仓库。由于我们的目的是创建一个空仓库,所以不需要勾选初始化 READMEgitignore 以及 licence 版权的信息。

完成这些设置后,GitHub 将显示一个新页面,提供几种初始化仓库的选项。对我们来说,重点是如何将本地仓库与远程仓库连接。以下是一个以 go-mongox 仓库为例的连接教程:

git remote add origin git@github.com:chenmingyong0423/go-mongox.git
git branch -M main
git push -u origin main

本地初始化 Go 项目

使用 go mod init 命令初始化 Go 项目。

go mod init github.com/chenmingyong0423/go-mongox

模块名称推荐使用 github.com/${用户名 | 组织名}/${仓库名} 的格式。

编写代码和测试用例

以 go-mongox 仓库为例,创建路径为 builder/query/bson_build.go.go 文件,在该文件里编写一个 Id 函数,用于快速构建基于 Id 查询数据的 BSON 语句。

package queryfunc Id(value any) bson.D {return bson.D{bson.E{Key: types.Id, Value: value}}
}

然后在测试文件 builder/query/bson_build_test.go 里编写测试代码:

package queryfunc TestId(t *testing.T) {testCases := []struct {name  stringvalue anywant  bson.D}{{name:  "test id",value: "Mingyong Chen",want:  bson.D{bson.E{Key: "_id", Value: "Mingyong Chen"}},},}for _, tc := range testCases {t.Run(tc.name, func(t *testing.T) {assert.Equal(t, tc.want, Id(tc.value))})}
}

运行测试用例,确保可以得到预期的运行结果。

除了功能性的代码之外,我们还可以考虑添加一个 .gitignore 文件,用于过滤掉不必要的文件和目录,比如编译产生的临时文件或者编辑器生成的配置文件。此外,添加版权信息也是一个重要决策。可以在源代码文件的头部添加版权声明,以及在仓库中包含一个 LICENSE 文件,明确指出其他人使用你的代码的许可和条件。

提交代码并推送到 Github

编写代码并测试通过之后,我们就可以把代码推送到远程的 Github 仓库啦。

git remote add origin git@github.com:chenmingyong0423/go-mongox.git
git branch -M main
git push -u origin main

发布版本

Github 仓库接收到最新的代码之后,我们就可以为自己的 Go 库发布第一个版本啦。

总体流程是这样的:访问仓库主页 → 点击 Releases 访问版本列表页 → 点击 Draft a new release 编辑版本 → 输入 tagRelease title 和版本描述 → 点击 Publish release 按钮发布版本。

下面是详细的步骤描述:

首先,访问 go-mongox 来到仓库主页,点击右下方的 Releases 选项,进入到版本列表页。

从 0 到 1 创建、测试并发布属于自己的 Go 开源库-1

进入到列表页之后,点击右上方的 Draft a new release 按钮进入到版本发布页。

从 0 到 1 创建、测试并发布属于自己的 Go 开源库-2

接着选择 tag(输入不存在的 tag 将被自动创建),命名格式推荐 vx.x.x。然后输入版本号 Release title(和 tag 命名一致)和编写版本描述,最后点击 Publish release 按钮进行版本的发布。

在这里插入图片描述

验证发布成功

发布我们自己的 Go 库之后,我们就可以在其他项目中安装并使用它啦。

  • 安装模块

    > go get github.com/chenmingyong0423/go-mongoxgo: downloading github.com/chenmingyong0423/go-mongox v0.18.1
    ···
    ···
    
  • 使用

    package mainimport "github.com/chenmingyong0423/go-mongox/builder/query"func main() {b := query.Id("陈明勇")
    }

小结

本文详细探讨了如何从 01 创建、测试并发布属于自己的 Go 开源库。整个流程并不复杂,但需特别注意的地方是 module 模块的命名规范以及 tag 标签和版本号的命名规范性。此外,添加一个.gitignore 文件和版权信息,有助于用于过滤掉不必要的文件和目录,明确指出其他人使用你的代码的许可和条件。

为了进一步提升开源库的质量和维护性,我们可以考虑扩展一些额外的功能。例如,利用 Git 钩子(Git hooks)自动对代码进行格式校验或运行测试,确保只有通过测试的代码才能提交到仓库。

此外,我们还可以使用 Makefile 来简化构建和部署过程。通过定义 make 命令,你可以一键完成构建、测试、部署等多项任务,这样不仅提升了开发效率,也保证了操作的一致性和可重复性。详情可参考 go-mongox 项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC——什么是人工智能生成内容

人工智能生成内容(AIGC)是当今数字时代的一个引人注目的前沿技术,它借助深度学习和自然语言处理等技术,使计算机系统具备了生成高质量文本、图像、音频等多媒体内容的能力。AIGC的出现不仅推动了信息技术的发展,也在多…

判断字符串由几个单词组成(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int world 0;int i 0;char c 0;char string[81] { 0 };int num 0;//提示用户&#xff…

C++---重载

1、运算符重载 #include <iostream> using namespace std; class complex { int rel; int vir; public: complex(){} complex(int rel,int vir):rel(rel),vir(vir){} void show() { cout << rel << "" << vir << "i" <&l…

(待更)DRF: 序列化器、View、APIView、GenericAPIView、Mixin、ViewSet、ModelViewSet的源码解析

前言&#xff1a;还没有整理&#xff0c;后续有时间再整理&#xff0c;目前只是个人思路&#xff0c;文章较乱。 注意路径匹配的“/” 我们的url里面加了“/”&#xff0c;但是用apifox等非浏览器的工具发起请求时没有加“/”&#xff0c;而且还不是get请求&#xff0c;那么这…

31.Gateway网关-跨域问题

跨域 1.域名不同&#xff1a;www.baidu.com和www.taobao.com,www.taobao.org 2.域名相同&#xff0c;端口不同。localhost:8080和localhost:8081 跨域问题 浏览器禁止请求的发起者与服务端发生跨域ajax请求&#xff0c;请求被浏览器拦截的问题。 解决方案 CORS 浏览器询…

0426_C高级4

练习1&#xff1a; 输入一个数字&#xff0c;实现数字逆置&#xff08;不使用字符串截取方式&#xff09; 1 #!/bin/bash2 read -p "输入一个数字&#xff1a;" number3 p$number4 result5 while [ $p -ne 0 ]6 do7 result$((result*10p%10))8 p$((p/10))9 …

input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案

文章目录 input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案问题描述解决办法 onCompositionStart与onCompositionEnd input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案 问题描述 测试环境&#xff1a;react antd input (react的事件与原生…

无人机GB42590接收端 +接收端模组,同时支持2.4G与5.8G双频

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/深圳四博智联科技有限公司https://shenzhendoit.taobao.com/category-1734422372.htm?spma1z10.1-c-s.0.0.560c74d77eT01G&searchy&catNameGB4…

VC2022 + protobuf

google这是有私心啊&#xff0c;protobuf从某个版本开始&#xff0c;依赖了一个google自己推出的大型组件集&#xff0c;Abseil&#xff0c;有点类似于Boost了&#xff0c;业内用的人&#xff0c;从个人狭窄的圈子来说&#xff0c;应该是不多的&#xff0c;据说google的众贤用的…

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

docker启动的mysql8中文乱码问题和无法输入中文

问题描述&#xff1a; 1.中文显示乱码 2.无法输入中文 中文乱码临时方案&#xff1a; show variables like ‘character%’; SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; 中文乱码永久方案&#xff1a; vim /etc/my.cnf[client] default-character-setutf8mb4[mysql]…

Linux详解:进程创建

文章目录 进程创建fork函数写时拷贝页表fork常规用法fork调用失败的原因 进程创建 fork函数 在linux 中fork函数&#xff0c;它从已经存在的进程中创建一个新的进程&#xff0c;新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h> pid_t fork(void);返…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

如何通过安全数据传输平台,保护核心数据的安全传输?

在数字化的浪潮中&#xff0c;企业的数据安全传输显得尤为关键。随着网络攻击手段的日益复杂&#xff0c;传统的数据传输方式已不再安全&#xff0c;这就需要我们重视并采取有效的措施&#xff0c;通过安全数据传输平台来保护核心数据。 传统的数据传输面临的主要问题包括&…

【介绍下IDM的实用功能】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【已解决】仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才可用。

当我们在使用vs code运行.c文件时可能会出现如下报错&#xff1a; 这是因为我们使用的生成和调试方式是cl.exe&#xff0c;我们需要更改到gcc.exe。 解决办法&#xff1a; 将所需运行的文件复制粘贴到新的一个文件夹下&#xff0c;此时再点击运行按钮会弹出如下窗口&#xf…

Vue入门到关门之计算属性与监听属性

一、计算属性 1、什么是计算属性 计算属性是基于其它属性计算得出的属性&#xff0c;就像Python中的property&#xff0c;可以把方法/函数伪装成属性&#xff0c;在模板中可以像普通属性一样使用&#xff0c;但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数…

Mysql 存在多条数据,按时间取最新的那一组数据

1、数据如下&#xff0c;获取每个用户最近的一次登录数据 思路1&#xff1a;order by group by 先根据UserIdLogInTime排序&#xff0c;再利用Group分组&#xff0c;即可得到每个User_Id的最新数据。 1 SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC; 排…

基于车载点云数据的城市道路特征目标提取与三维重构

作者&#xff1a;邓宇彤&#xff0c;李峰&#xff0c;周思齐等 来源&#xff1a;《北京工业大学学报》 编辑&#xff1a;东岸因为一点人工一点智能公众号 基于车载点云数据的城市道路特征目标提取与三维重构本研究旨在弥补现有研究在处理复杂环境和大数据量上的不足&#xf…

MFC实现ini配置文件的读取

MFC实现 ini 配置文件的读取1 实现的功能&#xff1a;点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径&#xff0c;以及在下面的编辑框中显示配置文件的内容。 1. 显示配置文件内容的编辑框设置 对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下&#x…