截止到go1.13, go 官方推出的包管理工具go module已经发布三个版本了,网上也有很多文章介绍如何使用go module,但是大部分都是讲如何引用别人的go module模块,鲜有提到如何发布自己的go module包的文章.本文将主要介绍如何"优雅"地发布自己的go module模块.
本文的代码和命令均在 Windows 10 中运行,go 的版本为 1.17.2
go.dev 是go官方团队于2019年11月上线的集合go开发资源的网站,包括一些学习课程和一些go的案例,当然最重要的就是提供了go的第三方包的检索功能.没错,他就是用来取代原来的godoc.org的,现在godoc.org上也有提示提醒用户迁移到pkg.go.dev.在这篇文章中,我们将把go module模块发布到pkg.go.dev
发布第一个版本
这次要发布的代码放在github,所以新建一个项目叫calendar, 新增SubDay.go 文件
为SubDay.go添加方法和相关注释
package calendar
import (
"fmt"
"strconv"
"strings"
"time"
)
const (
NewYear = "01-01" //新年
ValentinesDay = "02-14" //情人节
WomensDay = "03-08" //妇女节
ArborDay = "03-12" //植树节
AprilFoolsDay = "04-01" //愚人节
LaborDay = "05-01" //劳动节
YouthDay = "05-04" //青年节
ChildrensDay = "06-01" //儿童节
NationalDay = "10-01" //国庆节
Halloween = "10-31" //万圣夜
ThanksgivingDay = "11-25" //感恩节
NationalMemorialDay = "12-13" //国家公祭日
ChristmasEve = "12-24" //平安夜
Christmas = "12-25" //圣诞节
)
//获取当前年份
func thisYear() string {
ret := fmt.Sprint(time.Now().Format("2006"))
return ret
}
func SubDay() {
fmt.Println(time.Now().Format("早上好,摸鱼人!今天是2006年01月02日"))
fmt.Println("[摸鱼办]提醒您")
fmt.Println("工作再累,一定不要忘记摸鱼哦!")
fmt.Println("有事没事起身去茶水间,去厕所,去廊道走走")
fmt.Println("别老在工位上坐着,钱是老板的,但命是自己的")
nextNewYear()
defer func() {
fmt.Println("上班是帮老板赚钱,摸鱼是赚老板的钱!")
fmt.Println("最后,祝愿天下所有摸鱼人,都能愉快的渡过每一天")
}()
subValentinesDay()
subWomensDay()
subArborDay()
subAprilFoolsDay()
subLaborDay()
subYouthDay()
subChildrensDay()
subNationalDay()
subHalloween()
subThanksgivingDay()
subNationalMemorialDay()
subChristmasEve()
subChristmas()
}
//情人节
func subValentinesDay() {
day := strings.Join([]string{thisYear(), ValentinesDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离情人节还有%v天\n", int(unsub.Hours())/24)
}
//妇女节
func subWomensDay() {
day := strings.Join([]string{thisYear(), WomensDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离妇女节还有%v天\n", int(unsub.Hours())/24)
}
//植树节
func subArborDay() {
day := strings.Join([]string{thisYear(), ArborDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离植树节还有%v天\n", int(unsub.Hours())/24)
}
//愚人节
func subAprilFoolsDay() {
day := strings.Join([]string{thisYear(), AprilFoolsDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离愚人节还有%v天\n", int(unsub.Hours())/24)
}
//劳动节
func subLaborDay() {
day := strings.Join([]string{thisYear(), LaborDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离劳动节还有%v天\n", int(unsub.Hours())/24)
}
//青年节
func subYouthDay() {
day := strings.Join([]string{thisYear(), YouthDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离青年节还有%v天\n", int(unsub.Hours())/24)
}
//儿童节
func subChildrensDay() {
day := strings.Join([]string{thisYear(), ChildrensDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离儿童节还有%v天\n", int(unsub.Hours())/24)
}
//国庆节
func subNationalDay() {
day := strings.Join([]string{thisYear(), NationalDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离国庆节还有%v天\n", int(unsub.Hours())/24)
}
//感恩节
func subThanksgivingDay() {
day := strings.Join([]string{thisYear(), ThanksgivingDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离感恩节还有%v天\n", int(unsub.Hours())/24)
}
//国家公祭日
func subNationalMemorialDay() {
day := strings.Join([]string{thisYear(), NationalMemorialDay}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离国家公祭日还有%v天\n", int(unsub.Hours())/24)
}
//万圣夜
func subHalloween() {
day := strings.Join([]string{thisYear(), Halloween}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离万圣夜还有%v天\n", int(unsub.Hours())/24)
}
//平安夜
func subChristmasEve() {
day := strings.Join([]string{thisYear(), ChristmasEve}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离平安夜还有%v天\n", int(unsub.Hours())/24)
}
//圣诞节
func subChristmas() {
day := strings.Join([]string{thisYear(), Christmas}, "-")
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离圣诞节还有%v天\n", int(unsub.Hours())/24)
}
//计算和元旦的差值
func nextNewYear() {
thisYearInt, _ := strconv.Atoi(thisYear())
nextYearInt := thisYearInt + 1
nextYearStr := strconv.Itoa(nextYearInt)
day := strings.Join([]string{nextYearStr, NewYear}, "-") //2021-01-01
ret, _ := time.Parse("2006-01-02", day)
unsub := ret.Sub(time.Now())
if unsub < 0 {
return
}
fmt.Printf("距离明年还有%v天\n", int(unsub.Hours())/24)
}
执行 go mod init 生成go.mod文件
go mod init
go: creating new go.mod: module github.com/zhangyiming748/calendar
我们把代码push 到远端分支,看起来好像第一个版本就发布完毕了.我们打开pkg.go.dev搜索一下github.com/zhangyiming748/calendar
已经有了
第一个版本至此就算发布完了
发布新版本
go module 实际上是可以通过tag来发布版本的.当我们需要发布新版本时,对应的,我们需要使用git tag为这个版本打上标签.假设我们发布的下个版本是v2.0.0
$ git tag v2.0.0
$ git push --tags
$ git push master