手把手带你从0到1封装Gin框架:01 项目初始化
前言
日常我们在开发中,有新项目的时候都需要一个干净简洁的骨架项目,然后在这个骨架项目上堆砌我们的业务代码,但是有的骨架项目过度封装,很臃肿,所以在这里从0开始封装一个我们自己的骨架项目
适用人群
- 了解golang的基础语法即可
- 有一点数据库基础(这个不强制,不过做后端开发肯定都没啥问题)
项目源码
创建项目
mkdir eve_api
eve
是项目名称,这个根据自己喜好取就可以
初始化git
cd eve_api
git init
touch .gitignore
编辑.gitignore添加忽略的目录,可以根据自己的编辑器来自己设定
/tmp
config.yaml
/.idea
这个没什么好说的,因为项目是从0开始搭建的,所以后边会有一些迭代,会推翻之前的东西重写,用git保留一个记录,每篇教程后边我都会把当前对应的commit-hash
附在文末,方便大家直接checkout
到对应的版本进行查看
初始化go mod
项目依赖很多第三方库,这里直接用官方的go mod
来管理
go mod init eve
执行之后发现项目中多了一个go.mod
文件,这个文件里边会记录项目所依赖的第三方库以及项目对应golang版本号
安装cobra
一般情况下,我们一个web项目是需要可以启动http服务,还需要可以执行一些脚本(临时脚本或者定时任务脚本)、生成一些文件(model文件生成)等功能,那我们的项目就需要支持多种子命令来执行不同的操作,我们可以通过在入口文件main.go
中配置不同的参数来实现,当然也可以通过现有的一些库来实现,这里我们选择使用比较多的cobra
库来实现命令管理与生成
Cobra 是一个 Go 语言开发的命令行(CLI)框架,它提供了简洁、灵活且强大的方式来创建命令行程序
Cobra
分为cobra
和cobra-cli
两部分
cobra-cli
用来初始化项目文件以及生成新的命令文件
cobra
用来执行项目中生成的命令
使用cobra分三步
1、安装cobra-cli
go install github.com/spf13/cobra-cli@latest
2、使用cobra-cli初始化cobra
执行:
cobra-cli init
显示:
Your Cobra application is ready at
/.../your-project-dir
项目就初始化好了,通过tree
命令可以看到项目当前的结构如下:
➜ eve_api tree
.
├── LICENSE
├── cmd
│ └── root.go
├── go.mod
├── go.sum
└── main.go
1 directory, 5 files
可以看到自动生成了main.go
文件和cmd/root.go
文件
main.go
文件不需要再做任何改动
cmd/root.go
文件是对项目的描述,可以修改里边的描述来更好的展示我们的项目信息
到这里我们直接执行main.go
就可以看到输出了cmd/root.go
里边配置好的文本信息
➜ eve_api go run main.go
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
3、创建http服务启动命令
我们想通过后边加start
关键字来启动项目,那就可以执行:
➜ eve_api cobra-cli add start
start created at /your-project-dir/eve_api
执行完成之后可以发现生成了cmd/start.go
文件,直接执行go run main.go start
➜ eve_api go run main.go start
start called
会提示start命令被执行了
安装Gin框架并启动一个简单的http服务
通过go get -u github.com/gin-gonic/gin
来安装框架
➜ eve_api go get -u github.com/gin-gonic/gin
go: added github.com/bytedance/sonic v1.11.9
go: added github.com/bytedance/sonic/loader v0.1.1
go: added github.com/cloudwego/base64x v0.1.4
go: added github.com/cloudwego/iasm v0.2.0
go: added github.com/gabriel-vasile/mimetype v1.4.4
go: added github.com/gin-contrib/sse v0.1.0
go: added github.com/gin-gonic/gin v1.10.0
go: added github.com/go-playground/locales v0.14.1
go: added github.com/go-playground/universal-translator v0.18.1
go: added github.com/go-playground/validator/v10 v10.22.0
go: added github.com/goccy/go-json v0.10.3
go: added github.com/json-iterator/go v1.1.12
go: added github.com/klauspost/cpuid/v2 v2.2.8
go: added github.com/leodido/go-urn v1.4.0
go: added github.com/mattn/go-isatty v0.0.20
go: added github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: added github.com/modern-go/reflect2 v1.0.2
go: added github.com/pelletier/go-toml/v2 v2.2.2
go: added github.com/twitchyliquid64/golang-asm v0.15.1
go: added github.com/ugorji/go/codec v1.2.12
go: added golang.org/x/arch v0.8.0
go: added golang.org/x/crypto v0.25.0
go: added golang.org/x/net v0.27.0
go: added golang.org/x/sys v0.22.0
go: added golang.org/x/text v0.16.0
go: added google.golang.org/protobuf v1.34.2
由于依赖于github
,所以速度可能有一点慢,可以耐心等待,有些打不开github
的同学可以借助一点魔法,这里不过多解释
执行完成之后可以看到不止加载了gin
框架对应的库,还加载了gin
框架依赖的其他库,这里会自动加载,不需要我们手动干预
然后我们编辑cmd/start.go
文件:
// Package cmd /*
package cmd
import (
"github.com/gin-gonic/gin"
"github.com/spf13/cobra"
)
// startCmd represents the start command
var startCmd = &cobra.Command{
Use: "start",
Short: "start serve",
Long: `start serve`,
Run: func(cmd *cobra.Command, args []string) {
run()
},
}
func init() {
rootCmd.AddCommand(startCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// startCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// startCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
func run() {
r := gin.New()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"Message": "Hello World"})
})
err := r.Run(":8082")
if err != nil {
return
}
}
可以看到运行start
命令时会调用run
方法,在run
方法里启动了一个http
服务,运行go run main.go start
:
➜ eve_api go run main.go start
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET / --> eve_api/cmd.run.func1 (1 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8082
通过控制台可以看到启动了http
服务并且监听8082
端口,还提供了一个接,我们直接访问这个接口:
➜ ~ curl http://127.0.0.1:8082/
{"Message":"Hello World"}
➜ ~
可以看到返回了我们代码中配置的Hello World
本篇我们通过一系列的初始化操作搭建了一个依托Gin
框架的HTTP
服务,但是实际业务中,我们的业务逻辑不可能这么简单,肯定需要更多的组件,比如mysql
、redis
、logger
、crontab
,事件机制
等,还需要支持更多的路由,以及中间件等来支撑我们的业务
当然这也是写这个系列的目的:从0开始封装一个属于自己的框架
总结
本篇文章讲述了
- 做这个从0到1系列的初衷
- 项目初始化
- go mod的使用
- cobra的使用
- 创建简单的http服务
commit-hash: f4684a2
转载自:https://juejin.cn/post/7395218310399295523